方式一:对撞指针(头尾对调)
代码实现如下:
class Solution {
public void reverseString(char[] s) {
if(s==null || s.length<=1)
return;
int i=0;
int j=s.length-1;
while(i<j)
{
char ch=s[i];
s[i]=s[j];
s[j]=ch;
i++;
j--;
}
}
}
class Solution {
public void reverseString(char[] s) {
if(s==null || s.length<=1)
return;
for(int i=0,j=s.length-1;i<s.length/2;i++,j--)
{
char ch=s[i];
s[i]=s[j];
s[j]=ch;
}
}
}
时间复杂度O(n)
空间复杂度O(1)
方式二:递归
【递归结合双指针】
实际上就是从中间往两边交换,练习下递归
时间复杂度O(n)
空间复杂度O (n)
class Solution {
public void reverseString(char[] s) {
if(s==null || s.length<=1)
return;
recursion(s,0,s.length-1);
}
public void recursion(char[] chars,int left,int right){
if(left>=right)
return;
recursion(chars,left+1,right-1);
char ch=chars[left];
chars[left]=chars[right];
chars[right]=ch;
}
}
方式一的也可以用异或运算
class Solution {
public void reverseString(char[] s) {
int m = s.length;
int left = 0, right = m - 1;
while (left < right) {
s[left] ^= s[right];
s[right] ^= s[left];
s[left] ^= s[right];
left++;
right--;
}
}
}
eg:
a = 10,b=5
a=a^b=31
b=a^b=10
a=a^b=5