一、题目
Write a function that takes a string as input and returns the string reversed.
Example:
Given s = “hello”, return “olleh”.
二、分析和解答
1、首先想起两种:数组的反转和栈。栈的省略了。在数组中,第一位和最后一位交换;第二位和倒第二位交换,一直到中间的一位或者两位交换结束。其代码为:
public String reverseString(String s) {
char[] arr = s.toCharArray();
int len = arr.length;
for(int i=0;i<len/2;i++){
char tmp = arr[i];
arr[i] = arr[len-1-i];
arr[len-1-i] = tmp;
}
return new String(arr);
}
有三点需要注意:
(1)for循环中不能取等于号,具体可以举个例子自己试验一下:一个奇数个元素(len/2就是中间那个数,包含就是自己和自己交换;不包含就是不交换,都对),一个偶数个元素(len/2是中间两个元素靠后的那个,不包含就是把这两个数交换,包含就是交换后再交换,出错)。
(2)如何把字符数组变为字符串?new String()或者String.valueOf(arr);
(3)碰到字符串,一定注意字符串的边界条件。显然我忘了,具体看下面。
2、从快排我们可以获得另外一种写法:
public String reverseString(String s) {
if(s == null || s.length() == 0)
return s;
char[] arr = s.toCharArray();
int i = 0,j = arr.length - 1;
while(i < j){
char tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
return String.valueOf(arr);
}
这样就不用考虑中间的那个位置了,包不包括都对。
3、还有一种递归的方法,我之前没有想到,代码如下:
public String reverseString(String s) {
if("".equals(s) || s == null)
return s;
String str = s.substring(1);
return reverseString(str) + s.charAt(0);
}
不过这样 Memory Limit Exceeded!超出内存限制,会有一个非常非常长的案例无法通过!
Note:与字符交换相关的题目大都以字符串的逆序为基础,有点是局部逆序,有的是全局逆序后再局部逆序等等等等吧!