标签:test nbsp 自己 offer str 二次 剑指offer ever eve
输入英文句子,翻转句子中单词的顺序,但单词内字符顺序不变,标点当作普通字母处理。
如I am a student. 输出student a am i
第一步翻转整个句子,.tneduts a ma I
第二次翻转每个单词,student. a am I
(代码用了reverse函数,也可以自己写)
若用库函数,需要注意,迭代器的区间表示是前闭后开,[first, last),也就是[first, last-1]
class Solution { public: string ReverseSentence(string str) { reverse(str.begin(),str.end()); int front=0; int back=0; int size = str.size(); while(front < size) { while(front < size && str[front] == ‘ ‘) ++front; back=front; while(back < size && str[back] != ‘ ‘) ++back; reverse(str.begin() + front, str.begin() + back); front = back; } return str; } };
下面是重写ReverseCore,思路一样
class Solution { public: string ReverseSentence(string str) { int front=0; int back=0; int size = str.size(); ReverseCore(str,0, size - 1); while(front < size) { while(front < size && str[front] == ‘ ‘) ++front; back=front; while(back < size && str[back] != ‘ ‘) ++back; ReverseCore(str, front, back - 1); front = back; } return str; } void ReverseCore(string& str, int begin, int end){ if (begin > end) return; while (begin < end) swap(str[begin++], str[end--]); } };
字符串的左旋操作是把字符串前面若干个字符转移到字符串尾部。如 abcdefg和数字2,输出 cdefgab
借助上题思路,可以理解为 ab cdefg 然后按上述翻转字符串。
思想完全一样,先翻转整个,然后局部翻转。
class Solution { public: string LeftRotateString(string str, int n) { int len = str.size(); if (len == 0 || n > len) return ""; reverse(str.begin(), str.end()); reverse(str.begin(), str.begin() + len - n); reverse(str.begin() + len - n, str.end()); return str; } };
标签:test nbsp 自己 offer str 二次 剑指offer ever eve
原文地址:https://www.cnblogs.com/shiganquan/p/9350902.html