zoukankan      html  css  js  c++  java
  • LeetCode 557. Reverse Words in a String III

    Given a string, you need to reverse the order of characters in each word within a sentence while still preserving whitespace and initial word order.

    Example 1:

    Input: "Let's take LeetCode contest"
    Output: "s'teL ekat edoCteeL tsetnoc"
    

    Note: In the string, each word is separated by single space and there will not be any extra space in the string.

    first:

    import java.util.Stack;
    
    class Solution {
        public String reverseWords(String s) {
            Stack<Character> stack = new Stack<Character>();
            char[] array = s.toCharArray();
            //char[] output = new char[array.length];
            //ArrayList<Character> output = new ArrayList<Character>();
            StringBuilder sb = new StringBuilder();
            for(char c : array){
                if(c!=' '){
                    stack.push(c);
                }else{
                    while(!stack.empty()){
                        sb.append(stack.pop());
                    }
                    sb.append(' ');
                }
            }
            
            //Character[] outputArray = output.toArray(new Character[output.size()]);
            return sb.toString();
        }
    }

    result:

    Submission Result: Wrong Answer 
    Input: "Let's take LeetCode contest"
    Output: "s'teL ekat edoCteeL "
    Expected: "s'teL ekat edoCteeL tsetnoc"

    second:

    import java.util.Stack;
    
    class Solution {
        public String reverseWords(String s) {
            Stack<Character> stack = new Stack<Character>();
            char[] array = s.toCharArray();
            //char[] output = new char[array.length];
            //ArrayList<Character> output = new ArrayList<Character>();
            StringBuilder sb = new StringBuilder();
            for(char c : array){
                if(c!=' '){
                    stack.push(c);
                }else{
                    while(!stack.empty()){
                        sb.append(stack.pop());
                    }
                    sb.append(' ');
                }
            }
            
            while(!stack.empty()){
                sb.append(stack.pop());
            }
    
            
            //Character[] outputArray = output.toArray(new Character[output.size()]);
            return sb.toString();
        }
    }

    result:

    re-try:

    import java.util.Stack;
    //import java.util.Vector;
    
    class Solution {
        public String reverseWords(String s) {
            Stack<Character> stack = new Stack<Character>();
            char[] array = s.toCharArray();
            char[] output = new char[array.length];
            
            int endPointer = 0;
            for(char c : array){
                if(c!=' '){
                    stack.push(c);
                }else{
                    int size =stack.size();
                    for(int i=0;i<size;i++){
                        output[endPointer+i]=stack.pop();
                    }
                    output[endPointer+stack.size()+1] = ' ';
                    endPointer +=stack.size()+1;
                    
                }
            }
            
            while(!stack.empty()){
                output[endPointer]=stack.pop();
                endPointer++;
            }
    
            
            //Character[] outputArray = output.toArray(new Character[output.size()]);
            return new String(output);
        }
    }

    result:

    试着从StringBuilder和数组的角度去优化,但造成代码太复杂,不是一个好的选择。

    solution里的第1种方法:

    public class Solution {
        public String reverseWords(String s) {
            String words[] = s.split(" ");
            StringBuilder res=new StringBuilder();
            for (String word: words)
                res.append(new StringBuffer(word).reverse().toString() + " ");
            return res.toString().trim();
        }
    }

     result:

    solution里的第2种第3种方法

    比第一种慢。

    conclusion:

    很奇怪参考答案里的方法,最快的也才是50%+!另外感觉Stack比较慢!

    还需要注意的是,要熟悉String和StringBuffer的方法,比如String.split和StringBuffer.reverse。

  • 相关阅读:
    QTableView表格控件区域选择-自绘选择区域
    Qt高仿Excel表格组件-支持冻结列、冻结行、内容自适应和合并单元格
    QRowTable表格控件(三)-效率优化之-合理使用QStandardItem
    QRowTable表格控件(二)-红涨绿跌
    QRowTable表格控件-支持hover整行、checked整行、指定列排序等
    Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等
    Asp.net MVC利用Ajax.BeginForm实现bootstrap模态框弹出,并进行前段验证
    Bootstrap:弹出框和提示框效果以及代码展示
    Bootstrap treeview增加或者删除节点
    bootstrap-treeview 如何实现全选父节点下所有子节点及反选
  • 原文地址:https://www.cnblogs.com/hzg1981/p/8947949.html
Copyright © 2011-2022 走看看