code-翻转字符串里的单词

题目引自leetcode: https://leetcode-cn.com/problems/reverse-words-in-a-string/

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:

输入: "the sky is blue"
输出: "blue is sky the"
示例 2:

输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:

输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

 

说明:

无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

 

进阶:

请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。

 

该题目主要先将整个字符串翻转,然后检测每个单词,再对每个单词进行翻转.

以下代码主要亮点是没有新增加空间来存储新的字符串,所有操作都是在原字符串空间上完成的

class Solution {
public:
    string reverseWords(string s) {
        
        if (s.size() == 0) return string("");
        //翻转整个字符串
        int i = 0;
        int j = s.size()-1;
        while (j > i)
        {
            char tmp = s[i];
            s[i] = s[j];
            s[j] = tmp;
            i++;
            j--;
        }

        i = 0;
        j = 0;
        int m = 0;
        int cur_index = 0; 
        // 翻转每个单词
        while (m < s.size())
        {
            if (s[m] == ' ') //寻找单词开始的位置
            {
                m++;
            }
            else
            {
                //添加空格, 如果是第一个单词,则前面不添加空格
                if (cur_index !=0)
                {
                    s[cur_index] = ' ';
                    cur_index++;
                }
                int begin_index = cur_index;
                while (m < s.size()) //寻找单词结束的位置
                {
                    if (s[m] == ' ') break; 
                    if (m != cur_index)
                    {
                        s[cur_index] = s[m];
                    }
                    cur_index++;
                    m++;
                }

                //翻转该单词
                i = begin_index;
                j = cur_index-1;
                while (j > i)
                {
                    char tmp = s[i];
                    s[i] = s[j];
                    s[j] = tmp;
                    i++;
                    j--;
                }

            }
            
        }

        //删除多余的空间
        if (cur_index < s.size())
            s.erase(cur_index, s.size()-cur_index);
        return s;
    }
};

结果:

 

第一次有这么好的成绩,激动!!!

 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值