344. 反转字符串
class Solution { public: void reverseString(vector<char>& s) { for(int i = 0, j = s.size()-1; i < j; i++, j--){ char tmp = s[i]; s[i] = s[j]; s[j] = tmp; } } };
541. 反转字符串 II
class Solution { public: string reverseStr(string s, int k) { for(int i = 0; i < s.size(); i += 2*k){ if(i+k-1 < s.size()-1){ reverse(s.begin()+i, s.begin()+i+k); } else{ reverse(s.begin()+i, s.end()); } } return s; } };
心得:这题主要就是两个条件,判断i+k是否还在合理范围内,如果在就反转前k个符号,否则就说明会溢出,那么就反转剩下所有的。
剑指 Offer 05. 替换空格
class Solution { public: string replaceSpace(string s) { int oldSize = s.size(); int count = 0; for(int i = 0; i < s.size(); i++){ if(s[i] == ' ') count++; } s.resize(oldSize + 2*count); int newSize = s.size(); for(int i = oldSize-1, j = newSize-1; i < j; i--, j--){ if(s[i] != ' ') s[j] = s[i]; else{ s[j] = '0'; s[j-1] = '2'; s[j-2] = '%'; j -= 2; } } return s; } };
心得:我第一次做这道题的时候是新建一个数组,再分别把字符放入,这样会浪费空间。题解的方法不用申请新数组就能解决。
151. 反转字符串中的单词
class Solution { public: void removeExtraSpaces(string& s){ int slowIndex=0; for (int i=0; i<s.size(); i++){ if (s[i]!=' '){ if (slowIndex != 0) s[slowIndex++] = ' '; //单词之间用空格分隔,slow如果是在句首那就不用加了 while(s[i] != ' ' && i < s.size()){ s[slowIndex++] = s[i++]; } } } s.resize(slowIndex); } void reverseString(string& s, int start, int end){ for (int i=start, j=end; i<j; i++,j--){ swap(s[i],s[j]); } } string reverseWords(string s) { //1.去除前导 //2.去除中间多余一个的空格 //3.去除结尾空格 //erase函数的时间复杂度为O(n),所以如果遍历整个字符串进行erase时间复杂度会增加到O(n方) //先将整个字符串reverse一遍,再按单词为单位进行reverse,这样可以获得最好的时间复杂度 removeExtraSpaces(s); reverseString(s, 0, s.size()-1); int start = 0; for (int i=0; i<=s.size(); i++){ //需要<=,因为reverse是按照i-1 if (s[i] == ' ' || i == s.size()){ reverseString(s, start, i-1); start = i+1; } } return s; } };
剑指 Offer 58 - II. 左旋转字符串
class Solution { public: string reverseLeftWords(string s, int n) { reverse(s.begin(), s.end()); reverse(s.begin(), s.begin()+s.size()-n); reverse(s.begin()+s.size()-n, s.end()); return s; } };