剑指Offer(44)-- 翻转单词序列

题目描述

公司最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

输入

“student. a am I”

返回值

“I am a student.”

思路以及解答

第一种方法,Java里面有切割字符串的方法,直接用空格进行分隔,分隔成为多个单词,然后从字符串数组的后面开始,每一个字符拼接上一个空格,但是,值得注意的一点是,当只剩下一个字符串的时候,也就是索引为0的时候,不需要再拼接空格。代码实现如下:

public class Solution {
    
    
    public String ReverseSentence(String str) {
    
    
        if(str!=null&&str.length()!=0&&!str.equals("   ")){
    
    
            String[] strs = str.split(" ");
            StringBuilder stringBuilder = new StringBuilder();
            for(int i=strs.length-1;i>=0;i--){
    
    
                stringBuilder.append(strs[i]);
                stringBuilder.append(i==0?"":" ");
            }
            return stringBuilder.toString();
        }
        return str;
    }
}

第二种方式,是借助堆栈,堆栈是先进后出,也就是我们切割完字符串之后,全部放到堆栈中,再全部取出来拼接,就可以完成逆序的操作。有一个值得注意的点,就是空格的问题,我们压栈的时候,跟随着拼接上空格即可,最后一个字符不压入空格。

    public String ReverseSentence(String str) {
    
    
        if (str == null || str.length() == 0)
            return str;
        StringBuilder stringBuilder = new StringBuilder();
        String[] strs = str.split(" ");
        if (strs.length == 0)
            return str;
        Stack<String> stack = new Stack<>();
        for (int i = 0; i < strs.length - 1; i++) {
    
    
            stack.push(strs[i]);
            stack.push(" ");
        }
        stack.push(strs[strs.length - 1]);
        while (!stack.isEmpty()) {
    
    
            stringBuilder.append(stack.pop());
        }
        return stringBuilder.toString();
    }

【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。

おすすめ

転載: blog.csdn.net/Aphysia/article/details/114872936