代码随想录算法训练营第8天 | 344.反转字符串 、541. 反转字符串II 、卡码网:54.替换数字 、151.翻转字符串里的单词、卡码网:55.右旋转

81 阅读2分钟

 344.反转字符串 

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

            left++;
            right--;

        }
    }
}

题目链接/文章讲解/视频讲解:programmercarl.com/0344.%E5%8F…

 541. 反转字符串II

建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。 

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;
    }

    }
}

题目链接/文章讲解/视频讲解:programmercarl.com/0541.%E5%8F…

 卡码网:54.替换数字 

思路:先计算多少个数字,再定义该数字替换number以后的长度,从后往前填充数组

题目链接/文章讲解:programmercarl.com/kama54.%E6%…

 151.翻转字符串里的单词 

刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,比较难,细节比较多。 

class Solution {
    public String reverseWords(String s) {

        // 将字符串转换未数组
        char[] chars = s.toCharArray();
        //去掉空格,整体反转,再反转单词
        int slow = 0;
        for (int fast = 0; fast < chars.length; fast++) {
            if(chars[fast] != ' ') {
                // 用slow加空格,除了第一个单词外,单词末尾要加空格
                if (slow != 0) chars[slow++] = ' ';
                while(fast < chars.length && chars[fast] != ' ') {
                    chars[slow++] = chars[fast++];
                }
            }
        }

         //相当于 c++ 里的 resize()
        char[] newChars = new char[slow];
        System.arraycopy(chars, 0, newChars, 0, slow); 
        // 反转整个字符串
        reverse(newChars, 0 , newChars.length);

        //反转每个单词
        int begin = 0;
        for(int end = 0; end <= newChars.length ; end++) {
            if(end == newChars.length || newChars[end] == ' ') {
                reverse(newChars,begin, end);
                begin = end + 1;
            }
        }
        
        // 将字符串数组转换为字符串返回
        return new String(newChars);

    }

    // 反转函数,左闭右开[ )
    public void reverse(char[] chars, int start, int end) {
            for(int i =start, j = end-1 ;i < j; i++, j--) {
                char temp = chars[i];
                chars[i] = chars[j];
                chars[j] = temp;
            }
        }

}

题目链接/文章讲解/视频讲解:programmercarl.com/0151.%E7%BF…

卡码网:55.右旋转字符串 

思路:先整体翻转,再局部翻转

题目链接/文章讲解:

programmercarl.com/kama55.%E5%…