LeetCode Day08 344&541&05&151&58

75 阅读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. 反转字符串 II

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

                start ++;
                end --;
            }
        }

        return new String(ch);
    }
}

剑指 Offer 05. 替换空格

class Solution {
    public String replaceSpace(String s) {
        if(s == null){
            return null;
        }

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

151. 反转字符串中的单词

class Solution {
    /**
        1. 不用Java内置方法实现
        2. 去除首尾以及中间多余空格
        3. 反转整个字符串
        4. 反转各个单词
     */
    public String reverseWords(String s) {
        //1. 去除首尾以及中间多余空格
        StringBuilder sb = removeSpace(s);
        //2. 反转整个字符串
        reverseString(sb, 0, sb.length() - 1);
        //3. 反转各个单词
        reverseEachWord(sb);
        return sb.toString();
    }

    private StringBuilder removeSpace(String s){
        int start = 0;
        int end = s.length() - 1;
        while(s.charAt(start) == ' ') start ++;
        while(s.charAt(end) == ' ') end --;
        StringBuilder sb  = new StringBuilder();
        while(start <= end){
            char c = s.charAt(start);
            if(c != ' ' || sb.charAt(sb.length() - 1) != ' '){
                sb.append(c);
            }
            start ++;
        }

        return sb;
    }

    /**
     反转字符串指定区间的字符
     */
     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 --;
         }

     }

     private void reverseEachWord(StringBuilder sb){
         int start = 0;
         int end = 1;
         int n = sb.length();
         while(start < n){
             while(end < n && sb.charAt(end) != ' '){
                 end ++;
             }
             reverseString(sb, start, end - 1);
             start = end + 1;
             end = start + 1;
         }
     }
}

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

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