344. 反转字符串
题目链接:344. 反转字符串
思路: 简单双指针
我的代码:
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
题目链接:541. 反转字符串II
思路: 让i每次向前前进2k,如果剩下的字符个数小于k,将剩下的内容反转,否则反转前k个字符,反转用上一题的代码即可。
我的代码:
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
int len = s.length();
for (int i = 0; i < len; i += 2 * k) {
if (len - i < k) {
reverse(ch, i, len - 1);
} else {
reverse(ch, i, i + k - 1);
}
}
return new String(ch);
}
public void reverse(char[] ch, int l, int r) {
while (l < r) {
char temp = ch[l];
ch[l] = ch[r];
ch[r] = temp;
l++;
r--;
}
}
}
问题:
总结:
剑指Offer 05.替换空格
题目链接:剑指Offer 05.替换空格
思路: 不以训练算法为目标的话直接s.replace(" ", "%20")即可。如果要求原地修改的话,创建一个StringBuilder sb,搜索原字符串,如果有‘ ’,则sb末尾加两个空字符,即” “。这样确保了长度是正确的,接下来双指针,一个指向sb的末尾,一个指向sb中原字符串长度的索引,当不为空时,直接复制,为空时,赋值%20。
我的代码:
class Solution {
public String replaceSpace(String s) {
StringBuilder sb = new StringBuilder(s);
for (char c : s.toCharArray()) {
if (c == ' ') sb.append(" ");
}
char[] ch = sb.toString().toCharArray();
int left = s.length() - 1;
int right = sb.length() - 1;
while (left >= 0) {
if (ch[left] == ' ') {
ch[right--] = '0';
ch[right--] = '2';
ch[right] = '%';
} else {
ch[right] = ch[left];
}
left--;
right--;
}
return new String(ch);
}
}
问题:
总结:
151. 翻转字符串里的单词
题目链接:151.翻转字符串里的单词
思路: 首先要删除多余的空格,多余的空格指的是开头的空格和单词之间多余的空格/末尾多余的空格。处理完空格之后反转整个字符串,两层for循环,外层i指向每个单词的头,内层j指向尾部,反转i为头j为尾巴,反转完之后i = j + 2;
我的代码:
class Solution {
public String reverseWords(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c != ' ') {
sb.append(c);
} else if (!sb.isEmpty() && s.charAt(i - 1) != ' ') {
sb.append(' ');
}
}
if (sb.charAt(sb.length() - 1) == ' ') {
sb.deleteCharAt(sb.length() - 1);
}
char[] chars = sb.toString().toCharArray();
int n = chars.length;
reverse(chars, 0, n - 1);
for (int i = 0; i < n;) {
for (int j = i; j < n; j++) {
if (j + 1 == n || chars[j + 1] == ' ') {
reverse(chars, i, j);
i = j + 2;
break;
}
}
}
return new String(chars);
}
void reverse(char[] arr, int i, int j) {
while (i < j) {
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
}
}
问题:
总结:
剑指Offer58-II. 左旋转字符串
题目链接:剑指Offer58-II.左旋转字符串
思路: 我的思路是新建一个String str = s + s,这样从n位置开始遍历,长度一致时停止。
我的代码:
class Solution {
public String reverseLeftWords(String s, int n) {
String str = s + s;
StringBuilder sb = new StringBuilder();
for (int i = n; i < n + s.length(); i++) {
sb.append(str.charAt(i));
}
return sb.toString();
}
}
问题: 其实可以直接原字符遍历两次,第一次从n到末尾,第二次从0到n。
总结: