題目描述
對字符串中的全部單詞進行倒排。
說明:
一、每一個單詞是以26個大寫或小寫英文字母構成;
二、非構成單詞的字符均視爲單詞間隔符;
三、要求倒排後的單詞間隔符以一個空格表示;若是原字符串中相鄰單詞間有多個間隔符時,倒排轉換後也只容許出現一個空格間隔符;
四、每一個單詞最長20個字母;
輸入描述
輸入一行以空格來分隔的句子
輸出描述
輸出句子的逆序
輸入例子
I am a student
輸出例子
student a am I
算法實現
import java.util.Scanner;
/**
* Declaration: All Rights Reserved !!!
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
while (scanner.hasNextLine()) {
String input = scanner.nextLine();
// System.out.println("|" + reverse(input) + "|");
System.out.println(reverse(input));
}
scanner.close();
}
private static String reverse(String s) {
char[] chars = new char[s.length()];
int pos = 0;
// 下面進行字符串的壓縮,去掉前導各後面的空格,中間單詞間只保留一個空格
for (int i = 0; i < s.length();) {
// 從開始的i位置開始找第一個非空白字符
while (i < s.length() && s.charAt(i) == ' ') {
i++;
}
// 從開始的i位置開始找第一個空白字符
while (i < s.length() && s.charAt(i) != ' ') {
chars[pos] = s.charAt(i);
pos++;
i++;
}
// 此時i位置是一個空白字符,說明i後面還可能有非空白字符
// 因此須要添加一個空白字符做爲分隔
if (i< s.length()) {
chars[pos] = ' ';
pos++;
}
}
// 最後壓縮後最後一個字符的位置
pos--;
// System.out.println("|" + new String(chars, 0, pos+1) + "|");
// 將整個個字符串翻轉一次
reverse(chars, 0, pos);
// 下面找每一個單詞進行翻轉
for(int i = 0, j; i <= pos; i++) {
j = i;
// 找i從開始的第一個空白字符
while (i <= pos && chars[i] != ' ') {
i++;
}
// 進行單詞翻轉
reverse(chars, j, i - 1);
}
return new String(chars, 0, pos + 1);
}
private static void reverse(char[] arr, int beg, int end) {
char tmp;
while (beg < end) {
tmp = arr[beg];
arr[beg] = arr[end];
arr[end] = tmp;
beg++;
end--;
}
}
}