本文最后更新于628 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
题目链接/文章讲解/视频讲解:https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html
1.这个题其实没什么特别完整的思路,反转字符串会,反转子字符串也会,移除数组元素会,双指针也会,放到一起就不会了,我这个题还是应该多做几次,跟着视频和文档自己写了一遍代码,我直接就是红温了,我发现我这个对于边界条件的处理,还是欠缺不少,这次是在遍历字符串的时候,反转子字符串的最后部分 i<=s.size()我没加=,其实都有提示的,因为最后在遍历到最后一个位置i == s.size()或者是遇到 s[i] == ' '的时候就最好反转一次子串。
2.这个题 先去除所有空格,然后反转整个字符串,最后反转子字符串。
CPP
class Solution {
public:
string reverseWords(string &s) {
removeExtraSpaces(s);
reverse(s,0,s.size()-1);
int startindex = 0;
for(int i = 0;i<s.size();i++){
if(i==s.size()||s[i] == ' '){
reverse(s,startindex,i-1);
startindex = i+1;
}
}
return s;
}
void reverse(string &s,int start,int end){
for(int i = start,j = end;i<j;i++,j--){
swap(s[i],s[j]);
}
}
void removeExtraSpaces(string &s){
int slow = 0;
for(int i =0;i<s.size();i++){
if(s[i] != ' '){
if(slow != 0)s[slow++] = ' ';
while(i<s.size() && s[i] != ' '){
s[slow++] = s[i++];
}
}
}
s.resize(slow);
}
};