title: '算法:翻转单词顺序列' cover: https://img.paulzzh.com/touhou/random?50 categories: 算法题目 date: 1996-07-27 08:00:00 tags: [算法题目, 字符串]
<br/>
<!--more-->牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。
后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
先翻转整个字符串, 然后再翻转每一个单词(按照空格拆分)
需要注意的是, 最后一个单词结尾没有空格, 做特殊处理即可!
public class Solution {
public String ReverseSentence(String str) {
if (str == null) return null;
int len = str.length();
if (len <= 1) return str;
char[] arr = str.toCharArray();
// 整个翻转
reverse(arr, 0, len - 1);
// 翻转每个单词
int blankIndex = -1;
for (int i = 0; i < len; ++i) {
if (arr[i] == ' ') {
int next = i;
reverse(arr, blankIndex + 1, next - 1);
blankIndex = next;
}
}
// 翻转最后一个单词(末尾无空格)
reverse(arr, blankIndex + 1, len - 1);
return new String(arr);
}
// 翻转 [left, right]
private void reverse(char[] arr, int left, int right) {
while (left < right) {
swap(arr, left, right);
left++;
right--;
}
}
private void swap(char[] arr, int i, int j) {
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}