题目如下:
Write a function that takes a string as input and returns the string reversed.
Example:
Given s = "hello", return "olleh".
题目要求非常简单,就是要求将一个字符串逆序输出。
以下是我第一遍做这道题时使用的方法:
<span style="font-size:14px;">public static String reverseString(String s) {
String result = "";
for (int i=s.length()-1;i>=0;i--){
result += s.charAt(i);
}
return result;
}</span>
直接逆序获取原字符串的单个字符,然后一个个地拼接到新字符串中,最后输出结果,看起来应该没什么问题。但是在LeetCode上Submit的时候却遇到了这样的问题,问题截图如下所示:
在遇到一个超长字符串的时候会出现“超时”的问题。这是为什么呢?我一直最开始认为是循环次数过多了,直到我写了下面这个已Accepted的答案:
<span style="font-size:14px;">public String reverseString(String s) {
char[] array = new char[s.length()];
for (int i=0;i<array.length;i++){
array[i] = s.charAt(s.length()-i-1);
}
return new String(array);
}</span>
这里循环次数和上种解法是一样的,都等于原字符串的长度,但是这个解法就Accepted了,所以说可能是由于通过“+”来进行拼接字符串操作的时候非常费时,从而导致了超时现象的发生。我们来做实验测试一下,首先用concat方法试一下:
String result = "";
for (int i=s.length()-1;i>=0;i--){
result = result.concat(String.valueOf(s.charAt(i)));
}
return result;
结果同样是超时,那么我们再试一下 StringBuilder:
public class Solution {
public String reverseString(String s) {
StringBuilder sb = new StringBuilder();
for (int i=s.length()-1;i>=0;i--) {
sb.append(String.valueOf(s.charAt(i)));
}
return sb.toString();
}
}
结果神奇地Accepted了,所以,我觉得这已经可以从侧面反映出,确实是由于“+”拼接字符串的时候效率太低,太耗时导致了最后运行结果超时这一现象的产生。
最后在照例附上讨论区中的一种方法,如下所示:
<span style="font-size:14px;">public String reverseString(String s) {
char[] array=s.toCharArray();
for(int i=0;i<array.length/2;i++){
char temp=array[i];
array[i]=array[array.length-i-1];
array[array.length-i-1]=temp;
}
return new String(array);
}</span>
这种方法是先把字符串转换成数组,然后一步步交换数组的两侧,最后达到将字符串逆序的目的,这种方法由于循环此书只是之前次数的一半,所以运行时间也较之前少了不少。具体从时间上来说,使用StringBuilder(8ms) > 使用数组(5ms)> 使用数组,但循环次数减半(4ms)
所以,大家以后写程序的时候,尤其可能遇到大量字符串拼接问题的时候,尽量不要用“+”,因为这样会非常影响效率的。另外就是,在循环内部进行交换操作往往可以降低程序运行时间,减少循环次数,但是要开辟一块新内存用户缓存,是要较少的运行内存还是较少的运行时间应该根据实际情况进行取舍。
参考博客:
Java 5种字符串拼接方式性能比较 http://blog.csdn.net/kimsoft/article/details/3353849