LeetCode 344 解决拼接字符串超时的问题

这道题题目很简单,就是翻转一个给定的字符串

LeetCode 344 解决拼接字符串超时的问题_第1张图片

一开始的做法也很简单,没有想太多,直接一个for循环从后面遍历到前面,然后将得到的字符添加到新字符串的末尾,就结束了

public class Solution {
    public String reverseString(String s) {
        String result = "";
        for (int i = s.length() - 1; i >= 0; i--) {
            result += s.charAt(i);
        }
        return result;
    }
}
然后就超时了。。。

经过多方搜索,才知道原来字符串的拼接有好几种方式,用"+"号来拼接效率是很低的,所以在遇到需要很多次拼接的时候(比如这道题)就容易超时。为了让印象更深刻一些,总结了Java几种拼接字符串的方式,并且对它们的效率进行了测试。测试的数据是LeetCode上判定我超时的数据,一共14000+行,每行不超过10个字符。每种方法翻转这组数据100次,取耗时的平均值来进行效率的比较。

第一种拼接方式是最简单的用"+"号来拼接,代码跟上面贴的一样,翻转这组数据平均耗时4534.18ms

第二种方法是使用String的concat方法,使用起来和"+"号拼接差不多

String result = "";
for (int i = processString.length() - 1; i >= 0; i--) {
    result.concat(processString).charAt(i);
}
这种方法平均耗时3762.05ms

第三种方法是使用StringBuffer类的append方法,StringBuffer提供了一系列方法来操作字符串对象,使用toString()方法可以将StringBuffer对象转换为一个String对象

StringBuffer result = new StringBuffer();
for (int i = processString.length() - 1; i >= 0; i--) {
    result.append(processString.charAt(i));
}
return result.toString();
这种方法平均耗时1.25ms,远远少于前两种方法,因此如果需要对字符串进行拼接操作,应使用这种方法。事实上,如果需要对字符串进行操作,应尽量使用StringBuffer类提供的方法。
第四种方法是使用StringBuilder类的append方法,StringBuilder是JDK 1.5新增的方法,用法与StringBuffer基本相同,但StringBuilder没有实现线程安全功能,而StringBuffer是线程安全的,因此,StringBuilder类的效率会稍高一些。

StringBuilder result = new StringBuilder();
for (int i = processString.length() - 1; i >= 0; i--) {
    result.append(processString.charAt(i));
}
return result.toString();
这种方法的平均耗时为0.8ms

其实StringBuffer和StringBuilder都提供了翻转字符串的方法,即reverse方法,在这里也列出来做个比较

StringBuffer的reverse方法

StringBuffer result = new StringBuffer(processString);
result.reverse();
return result.toString();
平均耗时0.49ms

StringBuilder的reverse方法

StringBuilder result = new StringBuilder(processString);
result.reverse();
return result.toString();
平均耗时0.39ms

可以看出使用它们的方法来完成还是比自己拼接要快的。

你可能感兴趣的:(LeetCode)