單詞倒排

題目描述

對字符串中的全部單詞進行倒排。
說明:
一、每一個單詞是以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--;
        }
    }


}
相關文章
相關標籤/搜索