今日任务
● 344.反转字符串
● 541. 反转字符串II
● 剑指Offer 05.替换空格
● 151.翻转字符串里的单词
● 剑指Offer58-II.左旋转字符串
344. 反转字符串
双指针
class Solution {
public void reverseString(char[] s) {
int l = 0, r = s.length - 1;
while(l < r) {
char tmp = s[l];
s[l] = s[r];
s[r] = tmp;
l++;
r--;
}
}
}
541. 反转字符串 II
注意下for循环的下标处理就好,双指针解法
class Solution {
public String reverseStr(String s, int k) {
char[] arr = s.toCharArray();
int len = s.length();
for(int i = 0; i < len; i += 2*k) {
int start = i;
int end = Math.min(len - 1, i + k - 1);
while(start < end) {
char tmp = arr[start];
arr[start] = arr[end];
arr[end] = tmp;
start++;
end--;
}
}
return new String(arr);
}
}
剑指 Offer 05. 替换空格
class Solution {
public String replaceSpace(String s) {
StringBuilder sb = new StringBuilder();
for(char c : s.toCharArray()) {
if(c == ' ') {
sb.append("%20");
} else {
sb.append(c);
}
}
return sb.toString();
}
}
151. 反转字符串中的单词
双指针,从末尾进行处理
class Solution {
public String reverseWords(String s) {
StringBuilder sb = new StringBuilder();
int j = s.length() - 1, i = j;
while(i >= 0) {
while(i >= 0 && s.charAt(i) != ' ')i--;
sb.append(s.substring(i+1, j+1) + " ");
while(i >= 0 && s.charAt(i) == ' ')i--;
j = i;
}
return sb.toString().trim();
}
}
剑指 Offer 58 - II. 左旋转字符串
原地操作的话,就需要进行三次翻转,通过局部反转+整体反转 达到左旋转的目的。 而不用定义新的字符串,完全在本串上操作。
//解法:空间复杂度:O(1)。用原始数组来进行反转操作
//思路为:先整个字符串反转,再反转前面的,最后反转后面 n 个
class Solution {
public String reverseLeftWords(String s, int n) {
char[] chars = s.toCharArray();
reverse(chars, 0, chars.length - 1);
reverse(chars, 0, chars.length - 1 - n);
reverse(chars, chars.length - n, chars.length - 1);
return new String(chars);
}
public void reverse(char[] chars, int left, int right) {
while (left < right) {
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
left++;
right--;
}
}
}