剑指Offer(42_1)-翻转单词顺序

题目:

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

思路:

这道题依然需要使用翻转,但是与上左旋不同的是,左旋给定了翻转的区间,这道题需要我们自己去找。
我们采用双指针来来寻找子串的区间,i为子串起始位置,j为子串终点位置。当ch[i]等于空格时,说明没有找到起始位置,那么i和j都需要++,当i位置不为空格时,说明j需要来找到终点位置。然后j开始++,当找到第一个空格时,其前一个角标就是子串的终点位置。 此时进行翻转,然后i=j,再次寻找下一个子串
我们需要特殊处理的是当字符串最后一位不是空格时的子串。

代码实现:

public class Solution {
    private void swap(char[] ch,int a,int b){
        char tmp=ch[a];
        ch[a]=ch[b];
        ch[b]=tmp;
    }
    private void reverse(char[] ch,int l,int r){
        while(l<r){
            swap(ch,l++,r--);
        }
    }
    public String ReverseSentence(String str) {
        if(str==null||str.length()==0){
            return "";
        }
        int i=0;
        int j=0;
        char[] ch=str.toCharArray();
        reverse(ch,0,ch.length-1);
        while(j<ch.length){
            //跳过最开始的空格
            if(ch[i]==' '){
                j++;
                i++;
             //此时i在子串第一个字符位置
             // j找子串最后一个字符位置
            }else if(ch[j]!=' '){
                j++;
             //找到最后一个字符位置,子串翻转
            }else if(ch[j]==' '){
                reverse(ch,i,j-1);
                i=j;
            }
            //处理最后子串
            if(j==ch.length-1&&ch[i]!=' '){
                reverse(ch,i,j);
            }
        }
        return new String(ch);
    }
}

猜你喜欢

转载自blog.csdn.net/Fly_Fly_Zhang/article/details/92814764