Leetcode541. 反转字符串 II(字符串反转)

https://leetcode-cn.com/problems/reverse-string-ii/

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例:
输入: s = “abcdefg”, k = 2
输出: “bacdfeg”
要求:
该字符串只包含小写的英文字母。
给定字符串的长度和 k 在[1, 10000]范围内。

/*思路
将字符串分为slen / 2k 组,剩余的单独处理即可
*/

void reverse(char *s, int end, int k, int g){
    int i = 0;
    for(; i < end / 2; i++){
        int c1 = g * 2 * k + i;
        int c2 = g * 2 * k + end - i - 1;
        
        char tmp = s[c1];
        s[c1] = s[c2];
        s[c2] = tmp;
    }
}

char * reverseStr(char * s, int k){
    if(1 == k) return s;
    
    int lens = strlen(s);
    int g = lens / (2 * k);
    int left = lens % (2 * k);
    
    // 先处理剩余的
    int i = 0;
    if(left > 0 && left <= k){
        reverse(s, left, k, g);
    }else if (left > k){
        reverse(s, k, k, g);
    }
    // 处理前面规则的
    for(i = 0; i < g; i++){
        reverse(s, k, k, i);
    }
    
    return s;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值