翻转英文语句中单词的顺序

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

思路

看到讨论区第一的解决方法是用split来分割单词,创建新的字符串来倒着来添加,方法比较简单(然而我对split的用法不是很熟悉啊,正则表达式令人头大),但回复有说到题目的原意是不消耗额外的空间达到翻转的目的。
参考了回答区下面一位大佬的做法,主要是先对整个字符串进行翻转,然后再对每一个单词进行翻转,关键就是找到空格的位置来分割每一个单词。因为要翻转字符串,String类型显然是不行的,要将String转换成字符数组。那么问题来了,这个转换后的新字符数组不也是申请了额外的空间么…

时间复杂度
O(n)

代码

public class Solution {
    public String ReverseSentence(String str) {
        int l = str.length();
        char [] chars = str.toCharArray();
        Change(chars,0,l-1);//整个字符串翻转
        int nextblank = -1;
        int blank = -1;
        for(int i = 0;i < l;i++){//对每个单词进行翻转
            if(chars[i] == ' '){
                nextblank = i;
                Change(chars,blank+1,nextblank-1);
                blank = i;
            }
        }
        Change(chars,blank+1,l-1);//最后一个单词
        return String.valueOf(chars);
    }
    
    void Change(char[] chars,int left,int right){
        while(left<right){
            char c = chars[left];
            chars[left] = chars[right];
            chars[right] = c;
            left++;
            right--;
        }
    }
}
发布了9 篇原创文章 · 获赞 1 · 访问量 21

猜你喜欢

转载自blog.csdn.net/weixin_41613698/article/details/105575261
今日推荐