541反转字符串&& *****151好难的反转单词

75 阅读1分钟

今天状态不佳,写题脑子的速度明显没跟上。

看了一遍解法后自己打了一遍

class Solution {
    public String reverseStr(String s, int k) {
        char[] ss = s.toCharArray();    //把字符串变为字符数组的形式,这样子方便处理
        for(int i =0;i<ss.length;i+=2*k){
            int start = i;
            if(start+k<=ss.length-1) {
                reverse(ss,start,start+k-1);
                continue;
            }
            reverse(ss,start,ss.length-1);  //在这里的索引位置经常出错,要注意
        }
        return new String(ss);      //在这里把ss这个字符数组变为字符串
        
    }
    public void reverse(char[] t,int start,int right) {
        char temp;
        for(;start<right;start++,right--){
            temp = t[start];
            t[start] = t[right];
            t[right] =temp;
        }
    }
}

151做了两天,看解答看了两天才做出来,而且还是不是自己看后打的,二刷需要多加强一遍。二刷如果还不会,就三刷四刷,直到会为止。

class Solution {
    /**
     * 思路:
     *	①反转字符串  "the sky is blue " => " eulb si yks eht"
     *	②遍历 " eulb si yks eht",每次先对某个单词进行反转再移位
     *	   这里以第一个单词进行为演示:" eulb si yks eht" ==反转=> " blue si yks eht" ==移位=> "blue si yks eht"
     */
    public String reverseWords(String s) {
        //步骤1:字符串整体反转(此时其中的单词也都反转了)
        char[] initialArr = s.toCharArray();
        reverse(initialArr, 0, s.length() - 1);
        int k = 0;
        for (int i = 0; i < initialArr.length; i++) {
            if (initialArr[i] == ' ') {
                continue;
            }
            int tempCur = i;
            while (i < initialArr.length && initialArr[i] != ' ') {
                i++;
            }
            for (int j = tempCur; j < i; j++) {
                if (j == tempCur) { //步骤二:二次反转
                    reverse(initialArr, tempCur, i - 1);//对指定范围字符串进行反转,不反转从后往前遍历一个个填充有问题
                }
                //步骤三:移动操作
                initialArr[k++] = initialArr[j];
                if (j == i - 1) { //遍历结束
                    //避免越界情况,例如=> "asdasd df f",不加判断最后就会数组越界
                    if (k < initialArr.length) {
                        initialArr[k++] = ' ';
                    }
                }
            }
        }
        if (k == 0) {
            return "";
        } else {
            //参数三:以防出现如"asdasd df f"=>"f df asdasd"正好凑满不需要省略空格情况
            return new String(initialArr, 0, (k == initialArr.length) && (initialArr[k - 1] != ' ') ? k : k - 1);
        }
    }

    public void reverse(char[] chars, int begin, int end) {
        for (int i = begin, j = end; i < j; i++, j--) {
            chars[i] ^= chars[j];
            chars[j] ^= chars[i];
            chars[i] ^= chars[j];
        }
    }
}