把一个句子以单词为最小单位的翻转
考察点在于:在原来句子中,可能存在任意插入的空格,预处理删除这些空格
代码
class Solution {
public:
void reverseWords(string &s) {
tackleSpace(s);
reverse(s.begin(), s.end()); //整体翻转
int index = 0;
for (int i = 0;i < s.size();++i)
{
if (s[i] == ' ')
{
reverse(s.begin() + index, s.begin() + i); //每个word翻转
index = i + 1;
}
}
reverse(s.begin() + index, s.end()); //最后一个word翻转
}
void tackleSpace(string& s) //处理空格
{
for (int i=0;i<s.size();++i)
{
while (s[i] ==' '&&(s[i+1]==' '||i==s.size()-1||i==0))
{
s.erase(i, 1);
}
}
}
};
删除空格主要分为三种情况:
* 首部空格全部删掉
* 中间的连续空格,只保留一个
* 尾部的空格全部删掉
删除过程中,for和while结合使用的技巧:
for用来遍历整个string, index逐渐增大,但是在while中,string.size()会发生改变,而for的截止条件index < string.size()也会动态变化
理解string.size()
string s("abc");
cout << s[3] << "here" << endl; //不越界 s[4]会越界
for (int i = 0;i <= s.size();++i)
{
cout << s[i] << " address: " << (int)&s[i] << endl;
}
cout << '\0' << "here" << endl;
ASCILL码
‘\0’: 0, 在gcc里面不输出,在VS编译器输出空格
’ ’ : 32