1.题目描述
2.题解
i.双指针法
用左右两个指针不断向中间遍历,将指针所指元素交换,直到两指针重合。
ii.位运算符(位异或^)
将两个操作数转换成二进制,第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0。
由上可知(a^b)^b=a,遍历的循环与双指针法相比不变,而交换操作大概就是:a=a^b,b=a^b(此时的a=a^b,此时b=a),a=a^b(此时a=b),也就完成了交换。
3.代码示例
i.双指针法
class Solution {
public void reverseString(char[] s) {
char temp;
for(int i=0,j=s.length-1;i<j;){
temp=s[i];
s[i++]=s[j];
s[j--]=temp;
}
}
}
ii.采用位运算符
class Solution {
public void reverseString(char[] s) {
int l = 0;
int r = s.length - 1;
while (l < r) {
s[l] ^= s[r]; //构造 a ^ b 的结果,并放在 a 中
s[r] ^= s[l]; //将 a ^ b 这一结果再 ^ b ,存入b中,此时 b = a, a = a ^ b
s[l] ^= s[r]; //a ^ b 的结果再 ^ a ,存入 a 中,此时 b = a, a = b 完成交换
l++;
r--;
}
}
}