leetcode 344 541 151 + 力扣 剑指offer 05 58 (字符处理题)

114 阅读1分钟
  • leetcode 344 反转字符串 easy

题目链接: leetcode.com/problems/re…

思路: 两头双指针中间走。交换变量不用思路了,临时变量交换两个变量的值和位运算交换变量已经写烂了。

代码:

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

提交报错 (1):

第1次: 不认真并画蛇添足,题目void写了return, 题目传参直接是字符数组,当做字符串转数组报错。

  • leetcode 541 反转字符串II easy

题目链接: leetcode.com/problems/re…

思路: 循环步长2k锁定处理范围,判定进一步锁定翻转范围k以内,特殊处理长度不足k的情况。常用函数实现翻转给定字符串的给定范围。

代码:

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

提交报错 (2)

第1次: 死循环导致time limit exceed, 因为没有移动reverse函数start和end指针位置。

第2次: 没有考虑到长度不足k的情况,也就是判断外的操作,导致没有任何翻转操作。

  • leetcode 151 翻转字符串里的单词 easy

题目链接: leetcode.com/problems/re…

思路: 主要分为三个步骤,一是快慢双指针处理掉多余的空格,双指针移动逻辑,快指针找空格,慢指针补充该有的空格。二是翻转整个字符串。三是翻转每个单词,分别写函数处理。

代码:

class Solution {
    public String reverseWords(String s) {
        char[] arr = s.toCharArray();
        arr = removeSpace(arr);
        reverseString(arr, 0, arr.length - 1);
        reverseEachWord(arr);
        return new String(arr);
    }
    public char[] removeSpace(char[] arr) {
        int slow = 0;
        for (int fast = 0; fast < arr.length; fast++){
            if (arr[fast] != ' ') {
                if (slow != 0) {
                    arr[slow++] = ' ';
                }
                while (fast < arr.length && arr[fast] != ' ') {
                    arr[slow++] = arr[fast++];
                }
            }
        }
        char[] newArr = new char[slow];
        System.arraycopy(arr, 0, newArr, 0, slow);
        return newArr;
    }
    public void reverseString(char[] arr, int start, int end){
        while (start < end) {
            arr[start] ^= arr[end];
            arr[end] ^= arr[start];
            arr[start] ^= arr[end];
            start++;
            end--;
        }
    }
    public void reverseEachWord(char[] arr) {
        int start = 0;
        for (int end = 0; end <= arr.length; end++) {
            if (end == arr.length || arr[end] == ' ') {
                reverseString(arr, start, end - 1);
                start = end + 1;
            }
        }
    }
}

提交报错 (1):

第1次:

  • 剑指Offer 05 替换空格 easy

题目链接: leetcode.cn/problems/ti…

思路: 先找到空格位置增加空间,在新的数组空间快慢指针从右出发,找到空格则替换成%20,否则直接替换。

代码:

class Solution {
    public String replaceSpace(String s) {
        if (s.length() == 0) return s;
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == ' ') {
                sb.append("  ");
            }
        }
        
        if (sb.length() == 0) return s;
        
        int left = s.length() - 1;
        s += sb.toString();
        int right = s.length() - 1;
        char[] newS = s.toCharArray();
        while (left >= 0) {
            if (newS[left] == ' ') {
                newS[right--] = '0';
                newS[right--] = '2';
                newS[right] = '%';
            } else {
                newS[right] = newS[left];
            }
            left--;
            right--;
        }
        
        return new String(newS);
    }
}

提交报错 (1):

第1次: index out of range错误,int left = s.length();应为int left = s.length() - 1;

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

题目链接: leetcode.cn/problems/zu…

思路: 翻转字符串的给定始终位置方法妙用

代码:

class Solution {
    public String reverseLeftWords(String s, int n) {
        char[] newS = s.toCharArray();
        reverse(newS, 0, n - 1);
        reverse(newS, n, newS.length - 1);
        reverse(newS, 0, newS.length - 1);
        return new String(newS);
    }
    public void reverse (char[] arr, int start, int end) {
        while (start < end) {
            arr[start] ^= arr[end];
            arr[end] ^= arr[start];
            arr[start] ^= arr[end];
            start++;
            end--;
        }
    }
}

提交报错 (2):

第1次: toCharArray方法拼写错误, 写成toCharArrary。

第2次: 翻转逻辑想错,如果先翻转整个字符,则长度位置变化。逻辑不清晰错误。

错误逻辑

reverse(newS, 0, newS.length - 1);
reverse(newS, 0, n - 1);
reverse(newS, n, newS.length - 1);

改法A

reverse(newS, 0, n - 1);
reverse(newS, n, newS.length - 1);
reverse(newS, 0, newS.length - 1);

改法B

reverse(newS, 0, newS.length - 1);
reverse(newS, 0, newS.length - n - 1);
reverse(newS, newS.length - 1 - n, newS.length - 1);
  • 58 最后一个单词的长度 easy

题目链接: leetcode.cn/problems/le…

思路:

代码:

class Solution {
    public int lengthOfLastWord(String s) {
        int right = s.length() - 1;
        while (right >= 0 && s.charAt(right) == ' ') right--;
        if (right < 0) return 0;
        int left = right;
        while (left >= 0 && s.charAt(left) != ' ') left--;
        return right - left;
    }
}

提交报错 (3):

第1次: 思路错误

第2次: 特殊case错误 testcase1: "H" testcase2: "H "

第3次: runtime error