leetcode541.反转字符串II

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

先上自己写的

class Solution {
    public String reverseStr(String s, int k) {
        int flag = s.length() % (2 * k);
        int count = 0;
        char[] arr = s.toCharArray();
        
        while(count < s.length() - flag - 1){
            int left = count;
            int right = count + k - 1;
            reverse(arr,left,right);
            count += 2 * k;
        }
        if(flag <= k){
            reverse(arr,count,s.length() - 1);
        }else{
            reverse(arr,count,count + k - 1);
        }
        String res=new String(arr);
        return res;
        

    }
    public void reverse(char[] a,int l, int r) {
        char temp;
        while(l < r) {
            temp = a[l];
            a[l] = a[r];
            a[r] = temp;

            l++;
            r--;
        }
    }
}

思路:

1.先写一个reverse函数,用于反转固定长度的字符串。

2.对2k长度的字符串的前k个字符串做反转处理

3.对最后多出来的一段flag长度的字符串做特殊处理。


看了题解代码,比我简洁很多,贴上来放一放

class Solution {
    public String reverseStr(String s, int k) {
        char[] a = s.toCharArray();
        for (int start = 0; start < a.length; start += 2 * k) {
            int i = start, j = Math.min(start + k - 1, a.length - 1);
            while (i < j) {
                char tmp = a[i];
                a[i++] = a[j];
                a[j--] = tmp;
            }
        }
        return new String(a);
    }
}

作者:LeetCode
链接:https://leetcode-cn.com/problems/reverse-string-ii/solution/fan-zhuan-zi-fu-chuan-ii-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这个简洁好多啊,就是从左往右扫描字符串,然后每2k长度,互换0到k的字符串,它用Math.min完美处理了最后一段尾巴的情况,不用像我一样做特殊处理。

上一篇:Java 应用与数据库的关系| 学习笔记


下一篇:LeetCode: 189. 旋转数组