1. 反转字符串1
(1)for循环解决
class Solution {
public void reverseString(char[] s) {
int len = s.length, size = len;
for (int i = 0; i < len / 2; i++) {
size--;
char tmp = s[i];
s[i] = s[size];
s[size] = tmp;
}
}
}
2. 反转字符串2
(1)暴力
- 直接翻转每个 2k 字符块。
- 每个块开始于 2k 的倍数,也就是 0, 2k, 4k, 6k, …。需要注意的一件是:如果没有足够的字符,我们并不需要翻转这个块。
- 为了翻转从 i 到 j 的字符块,我们可以交换位于 i++ 和 j-- 的字符。
class Solution {
public String reverseStr(String s, int k) {
char[] a = s.toCharArray();
for (int start = 0; start < a.length; start += 2 * k) {
int i = start, j = Math.min(start + k - 1, a.length - 1); //如果剩余字符少于 k 个,则将剩余字符全部反转。
while (i < j) {
char tmp = a[i];
a[i++] = a[j];
a[j--] = tmp;
}
}
return new String(a);
}
}
(2)双指针
使用 l 和 r 两个指针分别圈出每次需要翻转的“理论”范围,每次翻转完更新 l 和 r,同时注意范围 [l, r]内不足 k 个的情况(将 r 与真实边界 n - 1取个 min)。
class Solution {
public String reverseStr(String s, int k) {
char[] cs = s.toCharArray();
int n = s.length();
for (int l = 0; l < n; l = l + 2 * k) {
int r = l + k - 1;
reverse(cs, l, Math.min(r, n - 1));
}
return String.valueOf(cs);
}
void reverse(char[] cs, int l, int r) {
while (l < r) {
char c = cs[l];
cs[l] = cs[r];
cs[r] = c;
l++; r--;
}
}
}