力扣:151.翻转字符串里的单词
题目:
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
翻转后单词间应当仅用一个空格分隔。
翻转后的字符串中不应包含额外的空格。
整体思路分三步:
一:移除多余空格(因为题目条件:字符串之间只能用一个空格连接)
二:将整个字符串反转
三:将每个单词反转
解决1的方法:双指针法
快指针指向要插入的元素的位置
慢指针指向要插入的位置
具体思路:
删除整体字符串前的空格(fastindex后移即可)
整理后删除整个字符串的空格(当前值与前一个值都是空格fastindex后移即可),最后可能会多出来一个空格(整体字符串后面有空格的情况)。
整体处理后,若出现这种情况(最后可能会多出来一个空格),删除最后一个空格即可。
解决2、3的方法:首尾值互换
一代码(去空格):
void extraspace(string &s){
int fastIndex = 0, slowIndex = 0;
for(; fastIndex < s.size(); fastIndex++){
if(s[fastIndex] != ' ') break;
}
for(; fastIndex < s.size(); fastIndex++){
if(fastIndex-1 > 0 && s[fastIndex] == ' ' && s[fastIndex-1] == ' '){
continue;
}
else{
s[slowIndex++] = s[fastIndex];
}
}
if( slowIndex-1 > 0 && s[slowIndex - 1] == ' ') s.resize(slowIndex-1);
else s.resize(slowIndex);
}
字符串翻转代码:
void reverse(string &s, int start, int end){
for(;start < end; start++,end--){
swap(s[start],s[end]);
}
}
main代码:
string reverseWords(string s) {
extraspace(s);
reverse(s,0,s.size()-1);
for(int i = 0; i < s.size(); i++){
int j = i;
while(s[j] != ' ' && j < s.size()) j++;
reverse(s, i, j-1);
i = j;
}
return s;
}
有关于数组的操作都要注意数组下标的范围。
while(s[j] != ' ' && j < s.size())
整体代码:
class Solution {
public:
void extraspace(string &s){
int fastIndex = 0, slowIndex = 0;
for(; fastIndex < s.size(); fastIndex++){
if(s[fastIndex] != ' ') break;
}
for(; fastIndex < s.size(); fastIndex++){
if(fastIndex-1 > 0 && s[fastIndex] == ' ' && s[fastIndex-1] == ' '){
continue;
}
else{
s[slowIndex++] = s[fastIndex];
}
}
if( slowIndex-1 > 0 && s[slowIndex - 1] == ' ') s.resize(slowIndex-1);
else s.resize(slowIndex);
}
void reverse(string &s, int start, int end){
for(;start < end; start++,end--){
swap(s[start],s[end]);
}
}
string reverseWords(string s) {
extraspace(s);
reverse(s,0,s.size()-1);
for(int i = 0; i < s.size(); i++){
int j = i;
while(s[j] != ' ' && j < s.size()) j++;
reverse(s, i, j-1);
i = j;
}
return s;
}
};
最后一个位置的赋值之后,两个同时后移然后越界,那么slowIndex也超了一个位置所以下面的代码slowIndex 要减 1 然后到达最后一个位置:s[slowIndex - 1]。
if( slowIndex-1 > 0 && s[slowIndex - 1] == ' ')