LeetCode:917.仅仅反转字母

解题想法:

  • 前后指针,前指针往后,后指针往前,都是字母时反转,不是字母是往里走,俩指针重合,遍历结束。没想法了
  • 哈希表,int: string(字母),。。。。好像也需要用双指针。。。不好。

代码:

出错:

  1. 超时
    class Solution {
    public:
        string reverseOnlyLetters(string s) {
            int n = s.size();
            int l = 0, r = n-1;
            while (true) {
                while (l<r && !isalpha(s[l])) {
                    l++;
                }
                while (l<r && isalpha(!s[r])) { //相等就不用判断了
                    r--;
                }
                if (l==r) {
                    return s;
                } else {
                    swap(s[l], s[r]);
                }
            }
        }
    };

    原因:交换之后没加l++和r--,导致交换后再一次前面俩个依旧满足俩个while循环,程序一直停在这里就行交换,死循环。

  2. 修改之后依旧有问题,给出的答案和与其答案差别很大,仔细观察发现第三个while里,
    !的位置写错了,修改之后直接报错,查了资料发现时数组下标出现了-1
  3. 又看了题解,重新发现了问题所在,对于跳出循环的条件,俺写了l==r,我仔细模拟过最后一次交换之后l、r之间有无字母的情况发现都是可以的,觉得没有问题,最后看了出现问题的案例,发现自己在模拟的时候,忘记了交换之后l++和r--。即第一次问题的遗留。。。。当最后一次交换的俩个字母相邻时,l++和r--,会导致l>r,前后指针会一直走,导致数组下表出现了-1的情况引起报错。

 正答:

class Solution {
public:
    string reverseOnlyLetters(string s) {
        int n = s.size();
        int l = 0, r = n-1;
        while (true) {
            while (l<r && !isalpha(s[l])) {
                l++;
            }
            while (l<r && !isalpha(s[r])) { //相等就不用判断了
                r--;
            }
            if (l>=r) {
                return s;
            } else {
                swap(s[l], s[r]);
            }
            l++;
            r--;
        }
        
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值