翻转吧!字符串!(字符串翻转、左旋字符串)

    xiaoxiao2021-04-14  62

    题目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; }

     

     

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-670087.html

    最新回复(0)