题目
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路
1、直接解决,每个单词空格分隔,将每个单词倒着拼接起来。
public String reverseSentence(char[] chars) {
String str = new String(chars);
if ("".equals(str.trim()))
return str;
String[] worlds = str.split(" ");
StringBuilder builder = new StringBuilder();
for (int i = worlds.length - 1; i >= 0; i--) {
builder.append(worlds[i]);
if (i != 0) {
builder.append(" ");
}
}
return builder.toString();
}
2、若题目中添加 “不使用额外的空间” 的条件。
- 可以使用两次翻转,先反转整个字符串的顺序,然后再逐个反转单词的顺序。
public String ReverseSentence(char[] chars) {
// 翻转整个字符串
reverse(chars, 0, chars.length - 1);
int worldStartIndex = 0;// 一个单词的起始下标
int curIndex = 0; // 当前字符下标
while (curIndex <= chars.length) {
// 当前字符为空格,或最后一个字符,反转前一个单词
if (curIndex == chars.length || chars[curIndex] == ' ') {
reverse(chars, worldStartIndex, curIndex - 1);
worldStartIndex = curIndex + 1;
}
curIndex++;
}
return new String(chars);
}
// 反转从start到end的字符
private void reverse(char[] chars, int start, int end) {
for (int i = start, j = end; i < j; i++, j--) {
swap(chars, i, j);
}
}
// 交换chars[i] chars[j]
private void swap(char[] chars, int i, int j) {
char temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
}