本次题目
- 344 反转字符串
- 541 反转字符串II
344 反转字符串
- 参考链表的206反转链表,双指针法:左右指针分别从数组头尾出发,相互交换数值,再同时向中间移动,直到左右指针相遇。
- 注意:交换数值可以用中间变量直接交换,也可以通过位运算^。
class Solution {
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;
// //位运算
// s[left] ^= s[right]; //两值不同的位
// s[right] ^= s[left]; //右=不同位^右=左
// s[left] ^= s[right]; //左=不同位^左=右
//继续下一轮循环
left++;
right--;
}
}
}
541 反转字符串II
- 边界为2k,每次左指针前进2k,然后进行判断区间内元素个数,小于k全部反转(右指针指向最后的元素),大于等于k反转前k个元素(右指针指向边界k元素),反转同上。
- 注意:将字符串转为字符数组toCharArray()再转为字符串new String();也可以使用new StringBuffer()处理字符串然后再toString()。
class Solution {
public String reverseStr(String s, int k) {
//将字符串转为字符数组
char[] sArr = s.toCharArray();
//开始循环,每次前进2k
for(int i = 0; i < sArr.length; i += 2*k){
//定义左指针
int left = i;
//根据区间元素个数定义右指针
int right = Math.min(i + k - 1, sArr.length - 1);
// //判断区间元素个数
// if(i + k <= sArr.length){
// right = i + k - 1;
// }else{
// right = sArr.length - 1;
// }
//替换区间内元素
while(left < right){
char temp = sArr[left];
sArr[left] = sArr[right];
sArr[right] = temp;
//继续下一轮
left++;
right--;
}
}
return new String(sArr);
}
}