目录

Leetcode541.-反转字符串-I

Leetcode——541. 反转字符串 I

题解一

思路

新引进了一个字符串对象,它相比String是可修改的,多线程安全的,通过它和String的一些方法,完成操作。

代码

class Solution {
    public String reverseStr(String s, int k) {
        StringBuffer res = new StringBuffer();
        int length = s.length();
        int start = 0;
        while(start < length){

            int firstK = (start + k < length) ? start + k : length;
            int secondK = (start + 2 * k < length) ? start + 2 * k : length;

            StringBuffer t = new StringBuffer(s.substring(start, firstK));
            res.append(t.reverse());

            start += 2 * k;
            if(firstK < secondK){
                res.append(s.substring(firstK, secondK));
            }
        }
        return res.toString();
    }
}

总结

新学习了一个StringBuffer类型,相比String来说,具有可操作(增删改和反转),多线程安全的特性。巩固了String对象的substring()方法(这里的string居然是小写),区间是大于等于a,小于b(例如s.substring(a,b))。

解法二

思路

通过start和end指针的移动,实现替换操作,第六行通过一个函数判断出需要反转的区间,然后通过i += 2 * k 来保留不需要反转的部分。

代码

class Solution {
    public String reverseStr(String s, int k) {
        char[] arr = s.toCharArray();
        for(int i = 0; i < arr.length; i += 2 * k){
            int start = i;
            int end = Math.min(arr.length-1, start + k-1);
            while(start < end){
                char temp = arr[start];
                arr[start] = arr[end];
                arr[end] = temp;

                start++;
                end--;
            }
        }
        return new String(arr);
    }
}

总结

这种替换方法,上一篇还没觉得多好用,这一篇直接就体现出来了,第六行的比较也可以用三元运算符,交换的部分也可以额外写一个函数替代。

个人对于这种题的解答,过于追求对过程的模拟,例如在我刚写的时候我特别想把starstart+k,start+kstart+2k,分开进行判断,以及对数组剩余长度的判断,但是回头一看分的实在有点太碎了,如这个题解就非常的清晰,但是我并不能完整的思考出来,还是需要精进。