1、题目:
Write a function that takes a string as input and returns the string reversed.
Example:
Given s = “hello”, return “olleh”.
2、分析与解答
最基本的想法就是首尾交换,将第一个与最后一个,第二个与倒第二个交换,依次进行直到中间即可。
class Solution {
public String reverseString(String s) {
int len = s.length();
char[] arr = s.toCharArray();
int low = 0;
int high = len - 1;
while(low < high){
char tmp = arr[low];
arr[low] = arr[high];
arr[high] = tmp;
low++;//这里易忘
high--;
}
return String.valueOf(arr);//将字符数组转换为字符串
}
}
3、变换顺序,使用栈明显管用
public String reverseString(String s) {
int len = s.length();
char[] arr = s.toCharArray();
Stack<Character> stack = new Stack<Character>();
for(int i=0;i<len;i++){
stack.push(arr[i]);
}
StringBuilder sb = new StringBuilder();
while(!stack.isEmpty())
sb.append(stack.pop());
return sb.toString();
}
注意:这里使用了StringBuilder来追加字符。
4、使用位运算中的异或
使用异或可以在不引入第三变量的情况下交换两个变量的值,如下:
A = A ^ B;
B = A ^ B ( = A );
A = B ^ A (= A ^ A ^ B = B);
即把第一种方法中的交换改为二进制的即可。有一点要注意:必须要进行(char)的强制转换。
public String reverseString(String s) {
char[] arr = s.toCharArray();
int low = 0;
int high = arr.length - 1;
while(low < high){
arr[low] = (char)(arr[low] ^ arr[high]);//注意这里
arr[high] = (char)(arr[low] ^ arr[high]);
arr[low] = (char)(arr[high] ^ arr[low]);
low++;
high--;
}
return new String(arr);
}
5、补充:当然还有一些别的算法,比如根据字符数组逆序输出,还可以递归。
public String reverseString(String s) {
if(s == null || s.length() <= 1)
return s;
return reverseString(s.substring(1)) + s.charAt(0);
}
递归原理:每次把字符串的第一位移动到最后一位,如果只剩一个(或为空),直接返回。