以前都是使用牛客网的OJ来练习,今天牛客网维护,才想到使用LeetCode,没想到居然还改版了,界面都不一样了。但是最让我眼前一亮的是这样一道简单题:字符串反转
334.Write a function that takes a string as input and returns the string reversed.
Example:
Given s = “hello”, return “olleh”.
Java很容易嘛,不就是字符串反转,那么最多是O(n),将字符串一次取值,并反向拼接。结果:报LTE错误,超时=_=
原来是Java中字符串的拼接使用StringBuffer。代码如下:
public String reverseString(String s) {
int len=s.length();
if(len==0) return "";
StringBuffer str=new StringBuffer();
str.append(s);
str.reverse();
return str.toString();
}
这里总结java中stringBuffer和String、StringBuilder的区别:
- String是不可变的,而其他两种是可变的;
- String和 StringBuffer是线程安全的,其中StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的,而StringBuilder并没有对方法进行加同步锁,所以是非线程安全的
- StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类),都会调用AbstractStringBuilder中的公共方法;
- 如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer;
此时,字符串连接操作中StringBuffer的效率要明显比String高。String对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值。StringBuffer对象实例化后,只对这一个对象操作。