Reverse Words in a String

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


posted @ 2014-11-17 23:01  evashi  阅读(109)  评论(0编辑  收藏  举报