字符串较难部分为反转字符串,共需要考虑以下几点难点 1.怎么把语句反转,再把单词反转回来,实时上是通过两次反转,第一次反转时反转整个语句,第二次时反转单词,注意迭代器的移动位置 2.去除空格的算法设计,应当充分考虑快慢指针的位置以及最后末尾还存在尾空格的情况
public:
string reverseWords(string s) {
//先对s进行翻转
reverse(s.begin(),s.end());
//将反转的字符变为正常单词、
for(int i=0;i<s.size();i++){
//跳过初始空格,并排除全部为空格的可能
while(i<s.size()&&s[i]==' ') i++;
if(i>=s.size()) break;
//使用j来记录单词的初始位置,并读取完整单词
int j=i;
while(i<s.size()&&s[i]!=' ')
i++;
//反转单词,注意,这里时左闭右开区间
reverse(s.begin()+j,s.begin()+i);
}
//去除多余空格,使用双指针
int slow=0;
for(int fast=0;fast<s.size();fast++){
// 跳过所有连续的空格(只保留第一个空格,或非空格字符)
if (s[fast] == ' ') {
// 仅当:不是开头空格 + 前一个字符不是空格 → 保留一个空格
if (slow > 0 && s[slow-1] != ' ') {
s[slow++] = ' ';
}
} else {
// 非空格字符,直接复制
s[slow++] = s[fast];
}
}
// 步骤4:截断字符串(去除末尾多余的空格)
if (slow > 0 && s[slow-1] == ' ') {
slow--; // 末尾有空格,回退一位
}
s.resize(slow); // 截断到有效长度
return s;
}
};