[刷题记录Day8]Leetcode

发布时间 2023-08-25 23:08:18作者: 喜欢毛绒绒的番茄子

No.1

题目

反转字符串

思路

  • 双指针,从头尾向中间遍历

代码

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

No.2

题目

反转字符串 II

思路

  • 灵活使用for循环,每个step2k
  • 理解Math.min(s.length() - 1, start + k - 1),根据end的位置不同做调整
  • 换位置时候的start和end是左闭右闭区间

代码

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

No.3

题目

剑指 Offer 05. 替换空格

思路

  • 利用StringBuilder的append

代码

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

No.4

题目

反转字符串中的单词
很考验字符串操作,实现比看起来要复杂得多

思路

  • 不用内置函数做
  • 移除首尾及中间多余空格
  • 将整个字符串反转
  • 将每个单词反转

代码

public String reverseWords(String s) {  
    // 去除首尾及中间的多余空格  
    StringBuilder sb = removeSpaces(s);  
  
    // 反转整个字符串  
    reverseString(sb, 0, sb.length() - 1);  
  
    // 反转单个单词  
    reverseEachWord(sb);  
  
    return sb.toString();  
}  
  
private StringBuilder removeSpaces(String str) {  
    int left = 0, right = str.length() - 1;  
    StringBuilder res = new StringBuilder();  
  
    // 去除首尾多余空格  
    while (str.charAt(left) == ' ') left++;  
    while (str.charAt(right) == ' ') right--;  
  
    while (left <= right) {  
        // 遇到非空格就append,遇到空格了,只保留已经在res中的那个  
        if (str.charAt(left) != ' ' || res.charAt(res.length() - 1) != ' ')  
            res.append(str.charAt(left));  
        left++;  
    }  
  
    return res;  
}  
  
private void reverseString(StringBuilder sb, int left, int right) {  
    while (left < right) {  
        char temp = sb.charAt(left);  
        sb.setCharAt(left, sb.charAt(right));  
        sb.setCharAt(right, temp);  
  
        left++;  
        right--;  
    }  
}  
  
private void reverseEachWord(StringBuilder sb) {  
    int left = 0, right = left + 1;  
  
    while (right < sb.length()) {  
        // 找到要反转的区间[left, right - 1]  
        while (right < sb.length() && sb.charAt(right) != ' ') right++;  
        reverseString(sb, left, right - 1);  
  
        left = right + 1;  
        right = left + 1;  
    }  
}

No.5

题目

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

思路

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串

代码

public String reverseLeftWords(String s, int n) {  
    StringBuilder sb = new StringBuilder(s);  
    for (int i = 0; i < n; i++) {  
        char c = sb.charAt(0);  
        sb.deleteCharAt(0);  
        sb.append(c);  
    }  
  
    return sb.toString();  
}