使用者輸入或外部資料常包含多連續空格、首尾空白,需正規化為「單一空格分隔、無首尾空白」的標準格式。本文提供純 Java 實作(不依賴正則),展示遞歸與字串操作邏輯。
/**
* 從 index 位置開始,遞歸計算連續空格個數
*/
public static int getBlankNumber(String s, int index) {
if (index < s.length()) {
if (s.charAt(index) == ' ') {
return getBlankNumber(s, index + 1) + 1;
}
}
return 0;
}
public static String mergeBlank(String s) {
for (int i = 0; i < s.length(); i++) {
int blankCount = getBlankNumber(s, i);
if (blankCount >= 2) {
// 保留一個空格:前段 [0, i) + 後段 [i+blankCount-1, end)
String part1 = s.substring(0, i);
String part2 = s.substring(i + blankCount - 1);
s = part1 + part2;
// 因為字串變短,索引需調整(這裡簡單處理,實務建議用 StringBuilder)
}
}
return s;
}
public static String trim(String s) {
if (s.isEmpty()) return s;
if (s.charAt(0) == ' ') s = s.substring(1);
if (!s.isEmpty() && s.charAt(s.length() - 1) == ' ') s = s.substring(0, s.length() - 1);
return s;
}
public static void main(String[] args) {
String input = " aaa a aa ";
String step1 = mergeBlank(input); // " aaa a aa "
System.out.println("[" + step1 + "]");
String step2 = trim(step1); // "aaa a aa"
System.out.println("[" + step2 + "]");
}
StackOverflowError,建議改用迴圈計數。substring + 連接 產生新物件,大量資料請使用 StringBuilder 或 char[] 原地修改。s.trim() 去首尾、s.replaceAll("\\s+", " ") 合併內部空白,JDK 內建高度優化。