题目:输入一行单词,将它们的顺序反转,标点符号也算一个单词,只考虑 “,” “.” “?”即可。例如:输入以下句子:

Where are you from?

I am from Beijng,China.

输出:

?from you are Where

.China,Beijing from am I

分析

此题是华为的一道机试题。但是当时有点问题,没有做出来。回来研究了一个半小时终于做出来了。

思路如下:

此题卡克在多行输入上了。当时想怎么处理这个多行输入的问题呢?现在想想只能输入是一个字符串数组,输出也是个字符串数组。将每一行当成字符串,然后分成 N 个单词,最后将这些单词倒序拼接成一个字符串赋给返回字符串。

代码实现

package com.huawei;

import java.util.Scanner;

public class Solution {
    public static void ReverseString(String[] OrgLine, String[] ReturnLine) {
        if (OrgLine == null || ReturnLine == null)
            return;
        String[] words = new String[20]; // 假定一行最多20个单词
        ClearWords(words); // 初始化单词数组
        for (int i = 0; i < OrgLine.length; i++) {
            int num = 0;
            ClearWords(words); // 清空单词数组
            for (int k = 0; k < OrgLine[i].length(); k++) {
                char ch = OrgLine[i].charAt(k);
                if (ch == ' ') {
                    num++;
                    continue;
                }
                if (ch == '.' || ch == '?' || ch == ',') {
                    num++;
                    words[num] = ch + "";
                    continue;
                }
                words[num] += ch;
            }
            for (int j = num; j >= 0; j--) {
                ReturnLine[i] += words[j] + " ";
            }
        }
    }

    public static void ClearWords(String[] words) {
        for (int i = 0; i < words.length; i++) {
            words[i] = "";
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] StrArr = new String[12];
        String[] Line = new String[12];
        for (int k = 0; k < StrArr.length; k++) {
            StrArr[k] = "";
            Line[k] = "";
        }
        int i = 0;
        String inputline = null;
        while (i < StrArr.Length && in.hasNextLine() && !(inputline = in.nextLine()).isEmpty()) { // 当下一行为空的时候结束输入
            StrArr[i] = inputline;
            i++;
        }
        in.close();
        ReverseString(StrArr, Line);
        for (int j = 0; j < i; j++)
            System.out.println(Line[j]);
    }
}

备注

此题思路并不复杂,但是当时困在标准输入输出上了,以前都是用C写程序,从控制台写入写出都比较熟练,但是用Java 就显得比较陌生一点。

今天的机试,让我明白了我对 Java 的字符串处理还是很陌生的,今后要在这个方面多加练习。