刷题日记07 | 151.翻转字符串里的单词、344.反转字符串、541. 反转字符串II、剑指Offer05.替换空格 、剑指Offer58

62 阅读2分钟

刷题日记

今天的主题是字符串

344. 反转字符串

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

541. 反转字符串 II

每隔2k个数反转前k个数,这道题考察的还是基础的代码能力,循环遍历时i应该i += 2*k ,除此之外,今天又复习了异或运算可以用来交换两个值(具体可以复习异或运算的交换律和恒等律)。

class Solution {
    public String reverseStr(String s, int k) {
        char[] res = s.toCharArray();
        int left;
        int right;
        for(int i = 0; i < s.length(); i += 2*k){
            left = i;
            right = Math.min(left + k - 1, s.length() - 1);
            while(left < right){
                res[left] ^=  res[right];
                res[right] ^= res[left];
                res[left] ^= res[right];
                left++;
                right--;
            }
        }
        return new String(res);

    }
}

151. 反转字符串中的单词

一道看起来很简单,实际上有点复杂的题。 一开始的思路是用split分割字符串,但总是会有额外的空格。 后来借鉴了Carl老师的思路,先去除字符串首尾和中间多余的空格,然后翻转整个字符串,再翻转每个单词。

class Solution {
    public String reverseWords(String s) {
        StringBuilder sb = new StringBuilder();
        //去除字符串首尾和中间多余的空格
        int start = 0;
        int end = s.length() - 1;
        while(s.charAt(start) == ' ') start++;
        while(s.charAt(end) == ' ') end--;
        while(start <= end){
            if(s.charAt(start) != ' ' || sb.charAt(sb.length() - 1) != ' '){
                sb.append(s.charAt(start));
            }
            start++;
        }
        //翻转整个字符串
        int left = 0;
        int right = sb.length() - 1;
        while(left < right){
            char temp = sb.charAt(left);
            sb.setCharAt(left, sb.charAt(right));
            sb.setCharAt(right, temp);
            left++;
            right--;
        }
        //翻转每个单词
        left = 0;
        right = 0;
        for(int i = 0; i < sb.length(); i++){
            if(sb.charAt(i) != ' ' && (i == 0 || sb.charAt(i - 1) == ' ')){
                left = i;
            }
            if(sb.charAt(i) != ' ' && (i == sb.length() - 1 || sb.charAt(i + 1) == ' ')){
                right = i;
                reverseWord(left, right, sb);
            }
        }
        return sb.toString();
    }
    public void reverseWord(int left, int right, StringBuilder sb){
        while(left < right){
            char temp = sb.charAt(left);
            sb.setCharAt(left, sb.charAt(right));
            sb.setCharAt(right, temp);
            left++;
            right--;
        }
    }
}

剑指 Offer 05. 替换空格

easy题,没什么说的

class Solution {
    public String replaceSpace(String s) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) == ' '){
                sb.append("%20");
            }else{
                sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }
}

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

easy题,没什么说的

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