算法修炼Day08|344.反转字符串541. 反转字符串II剑指Offer 05.替换空格 ● 151.翻转字符串里的单词 ● 剑指Offer58-

123 阅读1分钟

LeetCode:344. 反转字符串 - 力扣(LeetCode)

1.思路

双指针法

2.代码实现
class Solution {
    public void reverseString(char[] s) {
        int left = 0;
        int right = s.length - 1;
        // 双指针
        while (left <= right) {
            char temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--;
        }
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(1).

LeetCode:541. 反转字符串 II - 力扣(LeetCode)

1.思路

相比于反转字符串,本题多了一层for循环和跳跃判断条件,字符串和数组的转换。

2.代码实现
class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for (int i = 0; i < ch.length; i += 2 * k) {
            int left = i;
            int right = Math.min(ch.length - 1, left + k - 1);
            while (left <= right) {
                char temp = ch[left];
                ch[left] = ch[right];
                ch[right] = temp;
                left++;
                right--;
            }
        }
        return new String(ch);
    }
}
3.复杂度分析

时间复杂度:O(n^2).

空间复杂度:O(n).

LeetCode:剑指 Offer 05. 替换空格 - 力扣(LeetCode)

1.思路

调用s.trim()方法,去除s前后空格,String本身不可变,创建StringBuilder进行中间转换,for循环遍历,遇到空格添加"%20",否则添加相应字符即可。

2.代码实现
class Solution {
    public String replaceSpace(String s) {
        s.trim();
        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();
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(n).

LeetCode:

1.思路

去除字符串前后空格,去除中间多余空格,将字符串整体反转,将每个单词反转,返回即可

2.代码实现
// 写半天整个超时的,大怨种
class Solution {
    public String reverseWords(String s) {
        // 反转整个字符串,反转单词,返回结果即可
        s.trim();
        // 去除中间多余空格
        StringBuilder sb = new StringBuilder(s);
        for (int i = s.length() - 1; i > 0; i--) {
            while (sb.charAt(i) == ' ' && sb.charAt(i) == s.charAt(i - 1)) {
                i--;
            } 
            sb.append(sb.charAt(i));
        }
        char[] ch = new char[sb.length()];
        for (int i = 0; i < ch.length; i++) {
            ch[i] = sb.charAt(i);
        }

        int left = 0;
        for (int i = 0; i < ch.length; i++) {
            if (ch[i] == ' ') {
                int right = i - 1;
                while (left <= right) {
                    char temp = ch[left];
                    ch[left] = ch[right];
                    ch[right] = temp;
                }
                left = i + 1;
            }
            continue;
        }
        return Arrays.toString(ch);
    }
}
// 又又抄了一遍
class Solution {
    public String reverseWords(String s) {
        // 去除首尾及中间多余的空格
        StringBuilder sb = removeSpace(s);
        // 反转整个字符串
        reverseString(sb, 0, sb.length() - 1);
        // 反转每个单词
        reverseEachWord(sb);
        // 返回结果
        return sb.toString();
    }
    // 
    public 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;
        }
    }
}
3.复杂度分析

时间复杂度:O(n^2).

空间复杂度:O(n).

LeetCode:剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode)

1.思路

野路子,分两段添加

2.代码实现
class Solution {
    public String reverseLeftWords(String s, int n) {
        // 分两次写入
        if (n < 1) return s;
        StringBuilder sb = new StringBuilder();
        for (int i = n ; i < s.length(); i++) {
            sb.append(s.charAt(i));
        }
        for (int i = 0; i < n; i++) {
            sb.append(s.charAt(i));
        }
        return sb.toString();
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(n).