Reverse Words in a String

来源:互联网 发布:windows硬盘分区 编辑:程序博客网 时间:2024/06/06 14:28

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 方式大大节省了空间。


0 0
原创粉丝点击