小结:
本题可以作为笔试题,面试题。
作为面试题的话建议不要使用split,那样就失去了本题的意义。
字符串反转有2种类型:
①单词和单词之间只有一个空格
②单词和单词之间有多个空格
将这类题一网打尽!
1、题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
数据范围:
进阶:空间复杂度 ,时间复杂度 ,保证没有只包含空格的字符串
2、算法分析
本题有2种解题方法。
第一种方法是使用String类中的split()分割,该方法返回的是一个String[]类型的数组。使用trim()拼接就行。
第二种方法是先翻转整个字符串,然后再翻转每个单词
知识补充:
trim():去掉字符串首尾的空格
具体看代码,注释清晰:
3、代码实现
①翻转整个字符串,再反转每个单词
public class Solution {
public String ReverseSentence(String str) {
if(str == null || str.length() == 0){
return "";
}
char[] arr = str.toCharArray();
// 先翻转整个单词
reverseWord(arr,0,arr.length-1);
// 定义两个指针指向的是单词的位置
int start = 0;
int end = 0;
while(start < arr.length){
// 找到每个单词开始和结束的位置Index
if(arr[start] == ' '){
start++;
end++;
}else if(end == arr.length || arr[end] == ' '){
// 翻转的是单词的开头和结尾
reverseWord(arr,start,end-1);
// 翻转过后end++从下一个单词开始
end++;
start = end;
}else{
// 要不然还没到达单词的结尾
end++;
}
}
return String.valueOf(arr);
}
// 翻转helper公共部分
public void reverseWord(char[] arr,int start,int end){
while(start < end){
char temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
}
②使用split方法进行分割,使用StringBuilder拼接。
StringBuilder sb = new StringBuilder();
String[] s = str.split(" ");
for(int i = s.length - 1;i >= 0;i--){
sb.append(s[i] + " ");
}
return sb.toString().trim();