LeetCode字符串篇【反转字符串Ⅱ】

本文介绍了如何解决力扣平台上的一道题目,通过模拟和优化,提供两种不同的Java解决方案,针对字符串每隔2k个字符反转前k个字符的挑战。方法包括逐段处理和直接遍历字符数组,适用于面试和技术实践中的字符串操作问题。
摘要由CSDN通过智能技术生成

力扣题目链接(opens new window)

给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。

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

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

示例:

输入: s = "abcdefg", k = 2
输出: "bacdfeg"

正解

简单的一个模拟,定义好不同情况下字符串所要进行的操作即可

class Solution {
    public static String reverseStr(String s, int k) {
        StringBuffer buffer = new StringBuffer(s);
        int left = 0;
        int right = 0;
        int temp = right;
        while (right < s.length()) {//2k为一个划分,用left和right的下标定义该段
            if ((right + 1) % (2 * k) == 0 && right != 0) {
                left = temp;
                temp = right+1;
                change(buffer, left, right, k);
            }
            right++;
        }
        //这里对末尾的小于2k的字符串部分进行处理
        right--;
        if(temp<=right){
            left=temp;
            change(buffer, left, right, k);
        }
        return String.valueOf(buffer);
    }

    //不同段的核心判断代码
    public static void change(StringBuffer str, int left, int right, int k) {
        int num = right - left + 1;
        String cut;
        if (num < k) {
            StringBuffer temp = new StringBuffer(str.substring(left, right+1));
            temp.reverse();
            cut = String.valueOf(temp);
            str.replace(left, right+1, cut);
        } else {
            right = left + k;
            StringBuffer temp = new StringBuffer(str.substring(left, right));
            temp.reverse();
            cut = String.valueOf(temp);
            str.replace(left, right, cut);
        }
    }
}

其实在实践中我们可以发现字符串以2k为节点进行划分的,所以我们也可以截断for来跳转每一段去进行操作

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        // 1. 每隔 2k 个字符的前 k 个字符进行反转;这样很省时间
        for (int i = 0; i< ch.length; i += 2 * k) {
            // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if (i + k <= ch.length) {
                reverse(ch, i, i + k -1);
                continue;
            }
            // 3. 剩余字符少于 k 个,则将剩余字符全部反转
            reverse(ch, i, ch.length - 1);
        }
        return  new String(ch);

    }
    // 定义翻转函数
    public void reverse(char[] ch, int i, int j) {
        for (; i < j; i++, j--) {
        char temp = ch[i];
        ch[i] = ch[j];
        ch[j] = temp;
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值