算法入门第四天第二题 0.4.2
557.反转字符串中的单词III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
我的解法:
class Solution {
public:
string reverseWords(string s) {
int i=0,j=0;
while(j<=s.length()){
if(s[j]==' '||s[j]=='\0'){
reverse(s,i,j);
i=j+1;
}
++j;
}
return s;
}
private:
void reverse(string& s,int i,int j){
int n=j-1;
while(i<n){
swap(s[i],s[n]);
++i;
--n;
}
}
};
遇到的问题:
一开始没有注意到最后一个单词的问题,reverse条件设置为了if(s[j]= = ’ ‘),测试的时候发现最后一个单词没有反转。仔细思考,并且去查询了string类型的末尾是什么情况。所以当i指针停留在最后一个字符串的开始位置,j不断向后移动时,如果遇到末尾‘\0’,说明此时[i,j-1]位置是最后一个需要反转的字符串,这种情况可以单独讨论,给if语句加上s[j]==’\0’的条件。
附上查阅的资料:(本人转载仅供学习使用)
std::string:标准中未规定需要\0作为字符串结尾。编译器在实现时既可以在结尾加\0,也可以不加。(因编译器不同)
但是,当通过c_str()或data()(二者在 C++11 及以后是等价的)来把std::string转换为const char *时,会发现最后一个字符是\0。但是C++11,string字符串都是以’\0’结尾。
st char *时,会发现最后一个字符是\0。但是C++11,string字符串都是以’\0’结尾。