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;
}

代码问题: 在翻转每个单词的部分,有两个问题:

  1. 在翻转单词之前,需要判断单词的长度是否为0,如果为0则说明是连续的空格,不需要进行翻转。
  2. 在找到一个单词后,需要继续寻找下一个单词的起始位置,而不是直接移动到下一个字符。因此,需要将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;
    }
};

代码分析:

  1. 首先,代码对整个字符串进行反转。
  2. 然后,代码去除首尾空格。
  3. 接下来,代码遍历字符串,查找每个单词并进行反转。
  4. 优化后的代码通过判断单词长度是否为0来避免对连续空格进行反转,并通过将n++移到循环外部来找到下一个单词的起始位置。

总结: 优化后的代码解决了原始代码中的问题,能够正确地反转字符串中的单词顺序,并有效地处理了空格和空单词。

注意: 代码中的reverse()函数来自 <algorithm> 头文件。

更多相关内容:

  • C++ 字符串操作
  • 字符串反转算法
C++ 字符串反转单词顺序:优化代码,高效处理空格

原文地址: https://www.cveoy.top/t/topic/bkLS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录