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