344题.
思路:反转字符串使用双指针。两个指针从字符串的左右两端同时向中间移动,并互换每次索引所在位置的元素
代码:
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--;
}
}
541题.(增强版)
我自己比较难理解的部分是红框里的内容。思路:将字符串按照2k大小切割,分成N块。每一块就要判断满足红框里的哪个条件。
- 剩余字符少于k个,将剩余字符全部反转。(少于k个就是i + k 超过字符串的长度)
- 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。(反转第i至第i+k-1之间的字符,前k个中i也算一个,所以要-1)
public String reverseStr(String s, int k) {
char[] c = s.toCharArray();
for(int i = 0; i < s.length(); i += 2*k) {
if(i+k > s.length()) {//全部反转
int left = i;
int right = c.length - 1;
while(left < right) {
char temp = c[left];
c[left] = c[right];
c[right] = temp;
left++;
right--;
}
} else {//反转前 k 个字符
int left = i;
int right = i + k - 1;
while(left < right) {
char temp = c[left];
c[left] = c[right];
c[right] = temp;
left++;
right--;
}
}
}
return new String(c);
}
与反转数组一起复习(待补充)