代码随想录算法训练营第八天|344.反转字符串 、541. 反转字符串II 、剑指05.替换空格、 151.翻转字符串里的单词 、剑指58-II.左旋转字符串

58 阅读1分钟

今日任务 

●  344.反转字符串

●  541. 反转字符串II

●  剑指Offer 05.替换空格

●  151.翻转字符串里的单词

●  剑指Offer58-II.左旋转字符串

344. 反转字符串

双指针

class Solution {
    public void reverseString(char[] s) {
        int l = 0, r = s.length - 1;
        while(l < r) {
            char tmp = s[l];
            s[l] = s[r];
            s[r] = tmp;
            l++;
            r--;
        }
    }
}

541. 反转字符串 II

注意下for循环的下标处理就好,双指针解法

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

剑指 Offer 05. 替换空格

class Solution {
    public String replaceSpace(String s) {
        StringBuilder sb = new StringBuilder();
        for(char c : s.toCharArray()) {
            if(c == ' ') {
                sb.append("%20");
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }
}

151. 反转字符串中的单词

双指针,从末尾进行处理

class Solution {
    public String reverseWords(String s) {
        StringBuilder sb = new StringBuilder();
        int j = s.length() - 1, i = j;
        while(i >= 0) {
            while(i >= 0 && s.charAt(i) != ' ')i--;
            sb.append(s.substring(i+1, j+1) + " ");
            while(i >= 0 && s.charAt(i) == ' ')i--;
            j = i;
        }
        return sb.toString().trim();
    }
}

剑指 Offer 58 - II. 左旋转字符串

原地操作的话,就需要进行三次翻转,通过局部反转+整体反转 达到左旋转的目的。 而不用定义新的字符串,完全在本串上操作。

//解法:空间复杂度:O(1)。用原始数组来进行反转操作
//思路为:先整个字符串反转,再反转前面的,最后反转后面 n 个
class Solution {
    public String reverseLeftWords(String s, int n) {
        char[] chars = s.toCharArray();
        reverse(chars, 0, chars.length - 1);
        reverse(chars, 0, chars.length - 1 - n);
        reverse(chars, chars.length - n, chars.length - 1);
        return new String(chars);
    }

    public void reverse(char[] chars, int left, int right) {
        while (left < right) {
            char temp = chars[left];
            chars[left] = chars[right];
            chars[right] = temp;
            left++;
            right--;
        }
    }
}