zoukankan      html  css  js  c++  java
  • 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 方式大大节省了空间。


  • 相关阅读:
    Unity3d启动事件
    UI 科学
    LOL
    流光
    PlayerPrefs
    C++
    Android Home
    状态机
    架构设计
    AI
  • 原文地址:https://www.cnblogs.com/eva_sj/p/6172263.html
Copyright © 2011-2022 走看看