您的位置:首页 > 其它

344. Reverse String (字符串反转/逆序)

2018-03-08 19:43 387 查看
一、题目

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:与字符交换相关的题目大都以字符串的逆序为基础,有点是局部逆序,有的是全局逆序后再局部逆序等等等等吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: