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

这篇博客探讨了两种解决字符串处理问题的方法,重点在于使用双指针从右向左遍历字符串以提高效率。第一种解法虽然简单但效率低下,而第二种解法通过从右向左遍历避免了不必要的字符串拼接操作,显著提升了性能。同时,还介绍了使用istringstream进行更高效的字符串操作。这些技巧在处理大量字符串数据时尤为重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值