题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
这里提供两种思路
方法一
先对原始字符串以空格进行分割,分割成不同的单词,以字符串数组形式存放,然后从后往前遍历数组,逐个加入到stringbuffer中,每次加入一个后再加入一个空格“ ”,当到数组第一个位置时,不添加空格。
完整代码如下:
public class Solution {
public String ReverseSentence(String str) {
if(str.trim().equals("")){
return str;
}
String[] list = str.split(" ");
StringBuffer sb = new StringBuffer();
for(int i = list.length - 1; i >= 0; i --){
if(i != 0){
sb.append(list[i]);
sb.append(" ");
}else{
sb.append(list[i]);
}
}
return sb.toString();
}
}
其中
str.trim()
是去掉字符串两端的空格,假如输入为" This is YiiBai "
,则使用trim()后就变成了"This is YiiBai"
。
经过这样的操作后,就可以通过equals("")
来判断输入是否非空了,如果这样进行非空判断str.equals(" ")
,则只能判断是不是一个空格,假如输入为两个空格、三个空格,则无法判断。
方法二
两次反转的思路,先把整个字符串整体反转,如
“student. a am I”
,反转后变成“I ma a .tneduts”
,这时每个单词在句子中的顺序是对的,只是每个单词本身顺序颠倒了,然后再对每个单词进行反转,就得到了正确的序列“I am a student.”
完整代码如下:
public class Solution {
public String ReverseSentence(String str) {
char[] chars = str.toCharArray();
reverse(chars,0,chars.length - 1);
int blank = -1;
for(int i = 0;i < chars.length;i++){
if(chars[i] == ' '){
int nextBlank = i;
reverse(chars,blank + 1,nextBlank - 1);
blank = nextBlank;
}
}
reverse(chars,blank + 1,chars.length - 1);//最后一个单词单独进行反转
return new String(chars);
}
public void reverse(char[] chars,int low,int high){
while(low < high){
char temp = chars[low];
chars[low] = chars[high];
chars[high] = temp;
low++;
high--;
}
}
}
其中
reverse(char[] chars,int low,int high)
是反转字符串函数,low
和high
是指定只对固定范围的字符串进行反转。最开始low
为0
,high
为length-1
,就完成了字符串整体的反转,然后再通过判断空格来分割单词,对每个单词进行反转。
if(chars[i] == ' '){
int nextBlank = i;
reverse(chars,blank + 1,nextBlank - 1);
blank = nextBlank;
}
每次遇到空格,就把前一个空格位置加一和空格位置减一之间的字符串进行反转,因为最后一个单词后面没有空格,所以要单独反转。