Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue
",
return "blue is sky the
".
开始这么写的,但是出现Time Limit Exceeded:
public class Solution { public String reverseWords(String s) { String result=""; String[] splits=s.split(" ",-1); int tag=0;//标志现在还没有出现最末尾的单词 for(int i=splits.length-1;i>=0;i--) { if(!splits[i].equals("")) { System.out.println(splits[i]); if(tag==0)//还没有单词被加到result { result=result+splits[i]; tag=1; } else //之前已有单词加入result,剩余单词前面加空格 { result=result+" "+splits[i]; } } } return result; } }
后来程序改成如下,Accepted:
public class Solution { public String reverseWords(String s) { StringBuffer result=new StringBuffer(""); String[] splits=s.split(" ",-1); int tag=0;//标志现在还没有出现最末尾的单词 for(int i=splits.length-1;i>=0;i--) { if(!splits[i].equals("")) { if(tag==0)//还没有单词被加到result { result=result.append(splits[i]); tag=1; } else //之前已有单词加入result,剩余单词前面加空格 { result=result.append(" "+splits[i]); } } } return result.toString(); } }
后来看答案:
public String reverseWords(String s) { StringBuilder reversed = new StringBuilder(); int j = s.length(); for (int i = s.length() - 1; i >= 0; i--) { if (s.charAt(i) == ' ') { j = i; } else if (i == 0 || s.charAt(i - 1) == ' ') { if (reversed.length() != 0) { reversed.append(' '); } reversed.append(s.substring(i, j)); } } return reversed.toString(); }
三种算法的区别在于使用的数据类型不同:String,StringBuffer,StringBuilder
区别如下:
String 类型是不可变的,当执行
String s="a"; String s=s+"b";
时,后一句又开辟了一块不同于前一句的空间,每一个看似修改String 的方法都创建了一个全新的String 对象,而最初的String 对象则丝毫未动,这样如果数据量较多时,空间消耗较大,容易造成Time Limit Exceeded错误。
StringBuffer 是可变的字符串,执行
StringBuffer s=new StringBuffer("a"); s.append("ssss");时,不是新开辟一块空间,而是在原有空间基础上继续连接字符串,比String 方式大大节省了空间。