题目:
牛客最近来了一个新员工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);
}
}