344.反转字符串541.反转字符串剑指Offer05.替换空格剑指Offer58.左旋字符

810 阅读1分钟

344.反转字符串

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

541.反转字符串

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。 因为要找的也就是每2 * k 区间的起点

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

剑指Offer05.替换空格

空格替换成%20
首先扩充数组到每个空格替换成"%20"之后的大小。
然后从后向前替换空格,也就是双指针法,过程如下: i指向新长度的末尾,j指向旧长度的末尾。
image.png

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

剑指Offer58.左旋字符

把字符串前面的若干个字符转移到字符串的尾部。

输入: s = "abcdefg", k = 2
输出: "cdefgab"

先局部反转再整体反转,具体步骤为:

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串 image.png
class Solution {
    public String reverseLeftWords(String s, int n) {
        int len = s.length();
        StringBuilder sb = new StringBuilder(s);
        reverseString(sb,0,n-1);
        reverseString(sb,n,len-1);
        return sb.reverse().toString();
    }
    public void reverseString(StringBuilder sb, int start, int end){
        while(start < end){
            char temp = sb.charAt(start);
            sb.setCharAt(start,sb.charAt(end));
            sb.setCharAt(end,temp);
            start++;
            end--;
        }
    }
}

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情