剑指offer Leetcode 58 - I. 翻转单词顺序

image-20201217213711728

image-20201217213717602

我的解法:(双指针从左往右遍历,效率差,不使用)

思想:

​ 双指针获得每个单词,然后连起来。

复杂度:

​ string的相加效率很低

缺点:

​ 从左往右遍历时,后面的答案需要添加到字符串左边,所以效率很低。

​ 从右往左遍历时,直接用+=就好

代码:
class Solution {
public:
    string reverseWords(string s) {
        if(s.empty())
            return "";
        int left = 0, right = 0;
        string ans = "";
        while(right < s.size()){
            while(s[right] != ' ' && right < s.size())
                right++;
            if(right - left > 0){
                ans = s.substr(left, right - left) + ans;
                ans = " " + ans;
            }
            while(s[right] == ' ' && right < s.size())
                right++;
            left = right;
        }
        if(ans.empty())
            return "";
        return ans.substr(1, ans.size() - 1);
    }
};

正确解法1:双指针从右向左

思想:
复杂度:
代码注意点:

●遍历顺序,左到右还是右到左?

●right和left哪个要判断 < 0?

●找到一个单词后,怎么更新left/right来继续下一次遍历?

●返回值的分类讨论?

代码:
class Solution {
public:
    string reverseWords(string s) {
        string res = "";
        int s_size = s.size();
        if(s_size == 0)
            return "";
        int right = s_size - 1;
        while(right >= 0){
            //从后往前寻找第一字符
            while(s[right] == ' ' && right >= 0)
                right--;
            //right为-1会报错,而left为-1不会有问题,所以只要判断right
            if(right < 0)
                break;
            //从后往前寻找第一个空格
            int left = right;
            while(left >= 0 && s[left] != ' ')
                left--;
            //添加单词到结果
            res += s.substr(left + 1, right - left);
            res += ' ';
            //更新right到left,下次从这里开始访问
            right = left;
        }
        if(!res.empty())
            res.pop_back();
        return res;
    }
};

解法2:istringstream

https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof/solution/cshuang-bai-zhan-by-orange-32/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值