代码随想录Day8 | 344. 反转字符串 、541. 反转字符串II 、5.替换空格、151.翻转字符串里的单词、左旋转字符串 | 字符串

104 阅读1分钟

344. 反转字符串

题目链接:344. 反转字符串

思路: 简单双指针

我的代码:

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

问题:

总结:

541. 反转字符串II

题目链接:541. 反转字符串II

思路: 让i每次向前前进2k,如果剩下的字符个数小于k,将剩下的内容反转,否则反转前k个字符,反转用上一题的代码即可。

我的代码:

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        int len = s.length();
        for (int i = 0; i < len; i += 2 * k) {
            if (len - i < k) {
                reverse(ch, i, len - 1);
            } else {
                reverse(ch, i, i + k - 1);
            }
        }
        return new String(ch);
    }

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

问题:

总结:

剑指Offer 05.替换空格

题目链接:剑指Offer 05.替换空格

思路: 不以训练算法为目标的话直接s.replace(" ", "%20")即可。如果要求原地修改的话,创建一个StringBuilder sb,搜索原字符串,如果有‘ ’,则sb末尾加两个空字符,即” “。这样确保了长度是正确的,接下来双指针,一个指向sb的末尾,一个指向sb中原字符串长度的索引,当不为空时,直接复制,为空时,赋值%20。

我的代码:

class Solution {
    public String replaceSpace(String s) {
        StringBuilder sb = new StringBuilder(s);
        for (char c : s.toCharArray()) {
            if (c == ' ') sb.append("  ");
        }
        char[] ch = sb.toString().toCharArray();
        int left = s.length() - 1;
        int right = sb.length() - 1;

        while (left >= 0) {
            if (ch[left] == ' ') {
                ch[right--] = '0';
                ch[right--] = '2';
                ch[right] = '%';
            } else {
                ch[right] = ch[left];
            }
            left--;
            right--;
        }

        return new String(ch);
    }
}

问题:

总结:

151. 翻转字符串里的单词

题目链接:151.翻转字符串里的单词

思路: 首先要删除多余的空格,多余的空格指的是开头的空格和单词之间多余的空格/末尾多余的空格。处理完空格之后反转整个字符串,两层for循环,外层i指向每个单词的头,内层j指向尾部,反转i为头j为尾巴,反转完之后i = j + 2;

我的代码:

 class Solution {
    public String reverseWords(String s) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c != ' ') {
                sb.append(c);
            } else if (!sb.isEmpty() && s.charAt(i - 1) != ' ') {
                sb.append(' ');
            }
        }

        if (sb.charAt(sb.length() - 1) == ' ') {
            sb.deleteCharAt(sb.length() - 1);
        }

        char[] chars = sb.toString().toCharArray();
        int n = chars.length;
        reverse(chars, 0, n - 1);
        for (int i = 0; i < n;) {
            for (int j = i; j < n; j++) {
                if (j + 1 == n || chars[j + 1] == ' ') {
                    reverse(chars, i, j);
                    i = j + 2;
                    break;
                }
            }
        }
        return new String(chars);
    }

    void reverse(char[] arr, int i, int j) {
        while (i < j) {
            char temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }
}

问题:

总结:

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

题目链接:剑指Offer58-II.左旋转字符串

思路: 我的思路是新建一个String str = s + s,这样从n位置开始遍历,长度一致时停止。

我的代码:

class Solution {
    public String reverseLeftWords(String s, int n) {
        String str = s + s;
        StringBuilder sb = new StringBuilder();
        for (int i = n; i < n + s.length(); i++) {
            sb.append(str.charAt(i));
        }
        return sb.toString();
    }
}

问题: 其实可以直接原字符遍历两次,第一次从n到末尾,第二次从0到n。

总结: