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

59 阅读2分钟
题目:344. 反转字符串 - 力扣(LeetCode)
思路/想法:

遍历 + 双指针

代码实现:
class Solution {
    public void reverseString(char[] s) {
      // 遍历 + 双指针
      int left = 0, right = s.length - 1;
      while (left <= right) {
        char temp = s[left];
        s[left] = s[right];
        s[right] = temp;
        left++;
        right--;
      }
    }
}
题目:541. 反转字符串 II - 力扣(LeetCode)
思路/想法:

多个转换就迷,实在不好。遍历 + 双指针(针对前k个元素),跨越步数为 2k。

代码实现:
class Solution {
    public String reverseStr(String s, int k) {
      char[] c = s.toCharArray();
      for (int i = 0; i < c.length; i += 2 * k) {
        int start = i, end = Math.min(i + k - 1, c.length - 1);
        while (start <= end) {
          char temp = c[start];
          c[start] = c[end];
          c[end] = temp;
          start++;
          end--;
        }
      }
      return new String(c);
    }
}
题目:LCR 122. 路径加密 - 力扣(LeetCode)
思路/想法:

使用StringBuilder来操作字符串,可变字符降低创建和销毁时的空间开销。字符串表示:"";字符表示:''

代码实现:
class Solution {
    public String pathEncryption(String path) {
        char[] ch = path.toCharArray();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < ch.length; i++) {
            if (ch[i] == '.') {
                sb.append(" ");
            } else {
                sb.append(ch[i]);
            } 
        }
        return sb.toString();
    }
}
题目:151. 反转字符串中的单词 - 力扣(LeetCode)
思路/想法:

倒序遍历 + 遇到空格就将前面遍历过的字符串进行反转,对连续空格进行跳过,对字符串首尾进行去空。

代码实现:
class Solution {
    public String reverseWords(String s) {
        // 倒序遍历 + 遇到空格就将前面遍历到的字符串进行反转
        StringBuilder ans = new StringBuilder();
        for (int i = s.length() - 1; i >= 0; i--) {
            StringBuilder sb1 = new StringBuilder();
            while (i >= 0 && s.charAt(i) == ' ') {
                i--;
                continue;
            }
            while (i >= 0 && s.charAt(i) != ' ') {
                sb1.append(s.charAt(i));
                i--;
            }
            sb1.reverse();
            ans.append(sb1 + " ");
        }
        return ans.toString().trim();
    }
}
题目:LCR 182. 动态口令 - 力扣(LeetCode)
思路/想法:

创建动态字符串,拆分两段分别进行遍历

代码实现:
class Solution {
    public String dynamicPassword(String password, int target) {
        // 创建动态字符串,进行两段遍历
        StringBuilder ans = new StringBuilder();
        for (int i = target; i < password.length(); i++) {
            ans.append(password.charAt(i));
        }
        for (int i = 0; i < target; i++) {
            ans.append(password.charAt(i));
        }
        return ans.toString();
    }
}