將字符串按單詞逆序(如 "How old are you" → "you are old How")是經典面試題。本文提供原地操作 char[]、雙階段反轉算法:先整體反轉,再逐個單詞反轉,時間 O(n)、空間 O(1),附完整 Java 代碼與邊界處理細節。
"How old are you" → "uoy era dlo woH"。' 組成的單詞區間,逐個反轉 → "you are old How"。public static void reverseWords(char[] chars) {
// 1. 整體反轉
reverseChars(chars, 0, chars.length - 1);
// 2. 單詞級反轉
int begin = -1, end = 0;
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
boolean isLetter = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '\'';
if (isLetter) {
if (begin == -1) begin = i;
end = i;
if (i == chars.length - 1) reverseChars(chars, begin, end); // 末尾單詞
} else {
if (begin != -1) {
reverseChars(chars, begin, end);
begin = -1; end = 0;
}
}
}
}
private static void reverseChars(char[] chars, int begin, int end) {
while (end > begin) {
char tmp = chars[begin];
chars[begin++] = chars[end];
chars[end--] = tmp;
}
}
char[] chars = "How old are you !? I don't understand".toCharArray();
System.out.println("the first: " + new String(chars));
reverseWords(chars);
System.out.println("the second: " + new String(chars));
輸出:
the first: How old are you !? I don't understand the second: understand don't I !? you are old How
',標點/空格作為分隔符。掌握雙反轉技巧,可輕鬆應對「句子逆序」、「旋轉數組」、「回文判斷」等變體題目。