【面试题】翻转吧!字符串!

来源:互联网 发布:js原生查找标签 编辑:程序博客网 时间:2024/06/07 15:53

题目1:输入一个英文句子,翻转句子中单词的顺序,但单词内部的顺序不可改变。例如 I am a student. 翻转后变为 student. a am I 


经典解法:两步翻转,先整体翻转,再以空格为分隔,部分翻转。所以需要一个翻转函数。

翻转函数:

void Reverse(string::iterator begin,string::iterator end)    {        if(begin == end)            return ;        while(begin<end)        {            char tmp = *begin;            *begin = *end;            *end = tmp;                        ++begin;            --end;        }    }


两步翻转:

        string ReverseSentence(string str) {                if(str.empty() || str.size() < 2)            return str;                Reverse(str.begin(),--str.end());                    string::iterator head = str.begin();        string::iterator tail = str.begin();                string::iterator end = str.end();        while(head != end)        {            if(*head == ' ')            {                ++head;                ++tail;            }            else if(*tail == ' ' || tail == end)            {                Reverse(head,--tail);                head = ++ tail;            }            else            {                ++tail;            }        }        return str;    }

题目2:左旋字符串,就是把字符串前面若干个字符转移到字符串的尾部。例如:abcdefg ,和数字2,左旋后变为 cdefgab

解法:三步翻转法,将字符串分为两部分 ab  cdefg ,先翻转这两部分,再整体翻转。即ba gfedc  -> cdefgab

  string LeftRotateString(string str, int n)     {        int size = str.size();        if(size<2||n <= 0 || n>=size)            return str;        string::iterator it = str.begin();        string::iterator begin = str.begin();        string::iterator end = str.end();        while(it < end)        {            if(it == (begin+n-1))            {                Reverse(begin,it);                Reverse(++it,--end);                Reverse(begin,end);                break;            }            ++it;        }                return str;    }


0 0
原创粉丝点击