-
Reverse String
简单题class Solution { public void reverseString(char[] s) { for(int i = 0, j = s.length-1; i < s.length/2; ++i, --j){ char tmp = s[i]; s[i] = s[j]; s[j] = tmp; } } } -
Reverse String II
我自己写的破烂代码,效率太低了😂class Solution { private String reverse(String s){ int len = s.length(); String str = ""; for(int i = len-1; i >=0; --i){ str += s.charAt(i); } return str; } public String reverseStr(String s, int k) { String res = ""; int len = s.length(), cur = 0; while(cur < len){ if(len - cur >= 2 * k){ res = res + reverse(s.substring(cur, cur+k)) + s.substring(cur+k, cur+2*k); }else if(len - cur >= k){ res = res + reverse(s.substring(cur, cur+k)) + s.substring(cur+k); return res; }else{ res += reverse(s.substring(cur)); return res; } cur += 2 * k; } return res; } }
效率:

答案did everything in place, 但思路和这个大差不离。
-
剑指 Offer 05. 替换空格
偷懒用C++写的(找时间一定学一下Java的StringBuilder!)class Solution { public: string replaceSpace(string s) { int len = s.length(); string add = ""; for(int i = 0; i < len; ++i){ if(s[i] == ' '){ add += " "; } } s += add; int j = s.length()-1; for(int i = len-1; i >= 0 && j >= 0; --i, --j){ if(s[i] != ' '){ s[j] = s[i]; }else{ s[j] = '0'; s[j-1] = '2'; s[j-2] = '%'; j -= 2; } } return s; } }; -
Reverse Words in a String
我很不熟练的代码技术在这道题体现的淋漓尽致…知道思路了,最后也是写半天。最后那个(i+start)/2搞了半天…真是脑子不太好使了。可能因为今天刚workout完,有点累。class Solution { private: string reverse(string s){ for(int i = 0, j = s.length()-1; i < s.length()/2; ++i, --j){ swap(s[i], s[j]); } return s; } public: string reverseWords(string s) { //第一步:把extra white space去掉(除了词间距) int i = 0; while(s[i] == ' ') ++i; s = s.substr(i); while(i < s.length()){ if(s[i] == ' ' && s[i-1] == ' '){ s = s.substr(0, i) + s.substr(i+1); --i; } ++i; } if(s[s.length()-1] == ' ') s = s.substr(0, s.length()-1); //第二步:整个string reverse s = reverse(s); //第三步:每个词单独reverse i = 0; int start = 0; while(i <= s.length()){ if(i == s.length()|| s[i] == ' '){ for(int j = start, k = i-1; j < (i+start)/2; ++j, --k){ swap(s[j], s[k]); } start = i+1; } ++i; } return s; } };
这个代码效率也很低…菜狗是我了
这是我用双指针的解法,但需要创造O(k)的空间。
class Solution {
public:
string reverseLeftWords(string s, int k) {
int end = s.length();
for(int i = 0; i < k; ++i){
s += " ";
}
int len = s.length();
for(int i = end, j = 0; i < len; ++i, ++j){
s[i] = s[j];
}
return s.substr(k);
}
};
这个是答案的解法,效率比我的要高很多。思想很重要!
把n前,n后分别reverse,再最后reverse的想法很好!!
class Solution {
public:
string reverseLeftWords(string s, int k) {
reverse(s.begin(), s.begin()+k);
reverse(s.begin()+k, s.end());
reverse(s.begin(), s.end());
return s;
}
};
文章展示了几个关于字符串操作的编程问题解决方案,包括翻转字符串、替换空格、反转单词等。作者对比了自己的代码和高效解法,强调了效率和空间复杂度的重要性,提到了Java的StringBuilder优化和C++的实现方式。

被折叠的 条评论
为什么被折叠?



