剑指offer—58.翻转单词顺序列—分析及代码(Java)

一、题目

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

二、分析及代码

1. 两次翻转

(1)思路

先翻转各个单词,再对整个句子进行二次翻转,即实现目标。

(2)代码

public class Solution {
    
    
    public String ReverseSentence(String str) {
    
    
        if (str.trim().equals(""))
            return str;
        
        char[] chstr = str.toCharArray();
        int l = 0, length = str.length();
        for (int i = 0; i < length; i++) {
    
    
            if (chstr[i] == ' ') {
    
    
                Reverse(chstr, l, i - 1);
                l = i + 1;
            }
            if (i == length - 1 && l < i)
                Reverse(chstr, l, length - 1);
        }
        
        Reverse(chstr, 0, length - 1);
        return String.valueOf(chstr);
    }
    
    public void Reverse(char[] chstr, int l, int r) {
    
    
        int m = (l + r) >> 1;
        for (int i = l; i <= m; i++) {
    
    
            char temp = chstr[i];
            chstr[i] = chstr[l + r - i];
            chstr[l + r - i] = temp;
        }
        return;
    }
}

(3)结果

运行时间:21ms,占用内存:9648k。

2. 直接拼接

(1)思路

如果允许使用辅助空间,直接对原字符串进行拼接即可。

(2)代码

public class Solution {
    
    
    public String ReverseSentence(String str) {
    
    
        if (str.trim().equals(""))
            return str;
        String[] substr = str.split(" ");
        String ans = substr[substr.length - 1];
        for (int i = substr.length - 2; i >= 0; i--)
            ans = ans.concat(" " + substr[i]);
        return ans;
    }
}

(3)结果

运行时间:20ms,占用内存:9360k。

三、其他

暂无。

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/112040516