Leetcode 541. 反转字符串 II

该文章提供了一个Java解决方案,用于解决给定字符串s和整数k时,按照特定规则反转字符串的问题。代码首先判断特殊情况,然后计算需要反转的次数和剩余字符数,接着对字符串进行分段反转,最后处理剩余字符。核心是使用了`reverseString`函数来反转指定范围内的字符。
摘要由CSDN通过智能技术生成
原题信息

原题地址:541. 反转字符串 II

我的题解: java 遍历 分类处理 注释详细 逻辑执行效率高

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。

  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2 输出:"bacd"
解析思路
  1. 排除不需要交换的情况看k<2&&length<k

//排除特殊不需要反转的情况
 if(k<2&&length<k){
    return s;
  }
  1. 计算需要字符串需要反转的次数div和剩余字符mod

 //剩余字符数量
int mod = length%(2*k);
 //统计k的数量
nt div = length/(2*k);
  1. 反转这 2k 字符中的前 k 个字符。

for (int i = 0; i < div; i++) {
  //反转这 2k 字符中的前 k 个字符。
 reverseString(chars,i*2*k,k);
 }
  1. 处理剩余字符,两种情况mod>=k和mod<k分别处理。

if (mod>=k){//剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
    reverseString(chars,div*2*k,k);
}else {//剩余字符少于 k 个,则将剩余字符全部反转
    reverseString(chars,div*2*k,mod);
}
  1. 反转函数

//反转index开始后k个字符串
public  void reverseString(char[] s,int index,int k) {
    //只需遍历k/2,就可以完成k个字符串的反转
    for (int i = 0; i < k/2; i++) {
            char temp = s[i+index];
            s[i+index] = s[index+k-i-1];
            s[index+k-i-1] = temp;
    }
}
Code
public String reverseStr(String s, int k) {
      final int length = s.length();
        //排除特殊不需要反转的情况
        if(k<2&&length<k){
            return s;
        }
        final char[] chars = s.toCharArray();
        //剩余字符数量
        int mod = length%(2*k);
        //统计k的数量
        int div = length/(2*k);
         for (int i = 0; i < div; i++) {
            //反转这 2k 字符中的前 k 个字符。
            reverseString(chars,i*2*k,k);
        }
        if (mod>=k){//剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
            reverseString(chars,div*2*k,k);
        }else {//剩余字符少于 k 个,则将剩余字符全部反转
            reverseString(chars,div*2*k,mod);
        }
        return  new String(chars);
    }

    //反转index开始后k个字符串
    public  void reverseString(char[] s,int index,int k) {
        //只需遍历k/2,就可以完成k个字符串的反转
        for (int i = 0; i < k/2; i++) {
                char temp = s[i+index];
                s[i+index] = s[index+k-i-1];
                s[index+k-i-1] = temp;
        }
    }
执行效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值