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。

posted @   Zhao_Gang  阅读(108)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示