题目描述:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路一:
*先翻转整个句子,再依次翻转每个单词。
*依据空格来确定单词的起始和终止位置。
*要特别考虑到“ ”等输入中包含多余空格的情形
public class Solution {
public String ReverseSentence(String str) {
if (str.length() == 0) return "";
if (str.trim().equals("")) return str;
char[] chars = str.toCharArray();
reverse(chars, 0, chars.length - 1);
int i = 0;
int j = 0;
while (i < chars.length && j < chars.length)
{
while (j < chars.length && chars[j] != ' ')
j++;
reverse(chars, i, j - 1);
j++;
i = j;
}
return String.valueOf(chars);
}
private void reverse(char[] chars, int start, int end)
{
while (start < end)
{
char temp = chars[start];
chars[start] = chars[end];
chars[end] = temp;
start++;
end--;
}
}
}
思路二:
利用String对象的split方法。
public class Solution {
public String ReverseSentence(String str) {
if (str.length() == 0) return "";
if (str.trim().equals("")) return str;
String[] strArr = str.split(" ");
String res = "";
for (int i = strArr.length - 1; i >= 0; i--) {
res += strArr[i];
if (i > 0)
res += " ";
}
return res;
}
}
思路三:
public class Solution {
public String ReverseSentence(String str) {
if (str.length() == 0) return "";
if (str.trim().equals("")) return str;
String res = "";
String tmp = "";
for (int i = 0; i < str.length(); i++)
{
if (str.charAt(i) == ' ') {
res = " " + tmp + res;
tmp = "";
}
else
tmp = tmp + str.charAt(i);
}
if (tmp.length() != 0) res = tmp + res;
return res;
}
}
思路四:
使用一行递归
public class Solution {
public String ReverseSentence(String str) {
if (str.length() == 0) return "";
if (str.trim().equals("")) return str;
return (str.lastIndexOf(" ") == -1) ? str : str.substring(str.lastIndexOf(" ") + 1) +" " + ReverseSentence(str.substring(0, str.lastIndexOf(" ")));
}
}