C++ 字符串反转单词顺序:优化代码,高效处理空格
C++ 字符串反转单词顺序:优化代码,高效处理空格
问题描述: 给定一个字符串,例如 ' the sky is blue ',将其反转为 'blue is sky the'。
原始代码:
#include<iostream>
#include<string.h>
using namespace std;
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(), s.end());//翻转整个字符串
int i = 0, j = s.size(),k=0;
while (s[i] == ' '){
s.erase(i, 1);//清除字符串首空格
k++;//记录字符串首空格数目
}
while (s[j -k- 1] == ' ') {
s.erase(j -k-1, 1);
j--;
}//清除字符串尾空格
int m = 0, n = 0;//m:单词的首下标 n:单词的尾下标
for (m = 0; m < s.size(); m = n) {
while (s[n] != ' ' && n < s.size()) {
n++;
}
reverse(s.begin() + m, s.begin() + m + n);
while (s[n] = ' ' && n < s.size()) {
n++;
}
}
return s;
}
};
int main()
{
Solution s;
cout << s.reverseWords(' the sky is blue ') ;//验证首尾空格消除成功
cout <<'&';
return 0;
}
代码问题: 在翻转每个单词的部分,有两个问题:
- 在翻转单词之前,需要判断单词的长度是否为0,如果为0则说明是连续的空格,不需要进行翻转。
- 在找到一个单词后,需要继续寻找下一个单词的起始位置,而不是直接移动到下一个字符。因此,需要将
n++的位置移到while循环的外部。
优化后的代码:
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(), s.end());
int i = 0, j = s.size(), k = 0;
while (s[i] == ' ') {
s.erase(i, 1);
k++;
}
while (s[j - k - 1] == ' ') {
s.erase(j - k - 1, 1);
j--;
}
int m = 0, n = 0;
while (m < s.size()) {
if (s[m] == ' ') {
m++;
continue;
}
n = m + 1;
while (s[n] != ' ' && n < s.size()) {
n++;
}
if (n - m > 0) {
reverse(s.begin() + m, s.begin() + n);
}
m = n;
}
return s;
}
};
代码分析:
- 首先,代码对整个字符串进行反转。
- 然后,代码去除首尾空格。
- 接下来,代码遍历字符串,查找每个单词并进行反转。
- 优化后的代码通过判断单词长度是否为0来避免对连续空格进行反转,并通过将
n++移到循环外部来找到下一个单词的起始位置。
总结: 优化后的代码解决了原始代码中的问题,能够正确地反转字符串中的单词顺序,并有效地处理了空格和空单词。
注意:
代码中的reverse()函数来自 <algorithm> 头文件。
更多相关内容:
- C++ 字符串操作
- 字符串反转算法
原文地址: https://www.cveoy.top/t/topic/bkLS 著作权归作者所有。请勿转载和采集!