leetcode 541. 反转字符串II

 day8

问题:没有读懂题。不知道是每一个 2k 都去反转一次。

不要被绕进去

其实总的就可以分为两种情况。

反转 k 个,这个时候要判断需要反转的是不是够,也就是不要越界。有一个 if 判断,如果反转成功,直接continue,到下一段

不反转 k 个(末尾 < k

注意点:

1. i并不是每次都是 ++ -- ,不要养成定向思维了。。

2. reverse 函数可以指定从哪反转到哪

3. 如果是库里面的reverse函数,区间是左闭右开的。这里是自己实现的,左闭右闭。所以在调用的时候注意参数区间。不要越界

二刷:

1. 知道是分段来计算,但忘记了可以直接分为两种情况。

2. i 表示的是一段字符串的开头, 如果 +k -1  满足条件,就直接反转k。不满足就全部反转

class Solution {
public:

    // 处理分为两段。反转 k 个,不反转 k 个
    void reverse(string &s, int start,int end){
        int i = start , j = end;
        for(;i <= j;i++, j--)
            swap(s[i],s[j]);
    }

    string reverseStr(string s, int k) {
        for(int i = 0; i < s.size(); i += 2 * k)
        {
           // 因为这里要反转 k 个,要判断 i + k - 1是否超出了字符串的大小
            if( i + k - 1  < s.size() )   // 前部分满足 2k + 末尾满足 > k
            {
                reverse(s,i,i + k - 1);  
                continue;
            }
            // 不反转 k 个
            reverse(s,i,s.size() - 1);     // 末尾处理 < k 的情况
        }
        return s;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值