• 反转字符串中的单词-力扣


    此题将问题分为三步进行解决:

    • 第一步,删除字符串中多余的空格,removeSpaces函数中删除所有的空格,并手动在每个单词后添加一个空格,最后重构字符串s
    • 第二步,将整个字符串反转
    • 第三步,对反转后的字符串,遍历每个单词,将单词再次反转
    class Solution {
    public:
        string reverseWords(string s) {
            removeSpaces(s);
            reverseString(s);
            int left = 0;
            int right = 0;
            for(int i = 0; i < s.size(); i++){
                if(s[i] == ' '){
                    int right = i - 1;
                    while(left < right){
                        int temp = s[left];
                        s[left] = s[right];
                        s[right] = temp;
                        left++;
                        right--;
                    }
                    left = i + 1;
                }
    
                if(i == s.size() - 1){
                    int right = i;
                    while(left < right){
                        int temp = s[left];
                        s[left] = s[right];
                        s[right] = temp;
                        left++;
                        right--;
                    }               
                }
            }
    
            return s;
    
        }
    
        void removeSpaces(string& s){
            int slowindex = 0;
            int fastindex = 0;
            for(fastindex; fastindex < s.size(); fastindex++){
                if(s[fastindex] != ' '){
                    if(slowindex != 0){
                        s[slowindex++] = ' ';
                    }
                    while(fastindex < s.size() && s[fastindex] != ' '){
                        s[slowindex++] = s[fastindex++];
                    }
                }
            }
            s.resize(slowindex);
        }
    
        void reverseString(string& s){
            int left = 0;
            int right = s.size() - 1;
            while(left < right){
                int temp = s[left];
                s[left] = s[right];
                s[right] = temp;
    
                left++;
                right--;
            }
    
        }
    };
    

    代码随想录在处理第三步时,for循环的结束条件是 i <= s.size(), 这样就不用单独对最后一个单词作单独处理,服用一套交换代码。

        string reverseWords(string s) {
            removeExtraSpaces(s); //去除多余空格,保证单词之间之只有一个空格,且字符串首尾没空格。
            reverse(s, 0, s.size() - 1);
            int start = 0; //removeExtraSpaces后保证第一个单词的开始下标一定是0。
            for (int i = 0; i <= s.size(); ++i) {
                if (i == s.size() || s[i] == ' ') { //到达空格或者串尾,说明一个单词结束。进行翻转。
                    reverse(s, start, i - 1); //翻转,注意是左闭右闭 []的翻转。
                    start = i + 1; //更新下一个单词的开始下标start
                }
            }
            return s;
        }
    
  • 相关阅读:
    「Docker」M1 Pro 打包docker image问题合集
    LeetCode136只出现一次的数字
    SpringBoot - 实现启动时执行指定任务(CommandLineRunner、ApplicationRunner)
    关于openfeign的http和rpc
    git提示:remote origin already exists
    C语言-判断上三角矩阵
    115道Java面试题
    简便实用:在 ASP.NET Core 中实现 PDF 的加载与显示
    【无标题】
    Centos安装RabbitMQ超详细(必须收藏)
  • 原文地址:https://blog.csdn.net/why_12134/article/details/139333462