算法刷题Day8 - 字符串part1|LC.344 反转字符串|LC.541 反转字符串 II

LeetCode - 344. Reverse String 反转字符串

解题目标:给定一个字母列表,返回这个字母列表的倒序列表

解题思路:因为这道题要求只能改动输入的数组原地操作,个人采用的是双指针的写法,对称的位置互换元素。

class Solution {
    public void reverseString(char[] s) {
        int left = 0;
        int right = s.length - 1;
        while (left < right) {
            char temp = s[right];
            s[right--] = s[left];
            s[left++] = temp;
        }
    }
}

LeetCode - 541. Reverse String II 反转字符串 II

解题目标:给定一个字符串和正整数k,每2k个字符反转前k个字符,如果最后不够2k个且不够前k个就剩下的都反转,如果够前k个就反转前k个。

解题思路:这题的题目规则似乎很复杂,需要抓取其中的特定规律就可以简化代码,其实就是最好尾部能否凑足k个元素的不同操作的区别只需在每2k个区间内判断是否够k个元素来进行不同区间的反转。反转的逻辑和344题是一样的,但需要注意charArray转回String的时候需要new String()而不能直接return charArray.toString(),否则返回的是地址。

注意事项:这里要注意的是临界值判断的问题,这里反转区间统一采用左闭右开区间,在够k个的情况是小于等于的,因为去掉等于的情况就相当于跳过了最后末尾刚好够k个的情况。

class Solution {
    public String reverseStr(String s, int k) {
        for (int i = 0; i < s.length(); i += 2 * k) {
            //够k个的情况
            if (i+k <= s.length()) {
                s = reverse(s, i, i+k);
            } else {
            //不够k个的情况
                s = reverse(s, i, s.length());
            }
        }
        return s;
    }

    //helper function
    private String reverse(String s, int start, int end) {
        int left = start;
        int right = end - 1;
        char[] arr = s.toCharArray();
        while (left < right) {
            char temp = arr[left];
            arr[left++] = arr[right];
            arr[right--] = temp;
        }
        return new String(arr);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值