1. 程式人生 > >CCF之命令列選項(java)

CCF之命令列選項(java)

試題編號: 201403-3
試題名稱: 命令列選項
時間限制: 1.0s
記憶體限制: 256.0MB
問題描述: 問題描述   請你寫一個命令列分析程式,用以分析給定的命令列裡包含哪些選項。每個命令列由若干個字串組成,它們之間恰好由一個空格分隔。這些字串中的第一個為該命令列工具的名字,由小寫字母組成,你的程式不用對它進行處理。在工具名字之後可能會包含若干選項,然後可能會包含一 些不是選項的引數。
  選項有兩類:帶引數的選項和不帶引數的選項。一個合法的無引數選項的形式是一個減號後面跟單個小寫字母,如"-a" 或"-b"。而帶引數選項則由兩個由空格分隔的字串構成,前者的格式要求與無引數選項相同,後者則是該選項的引數,是由小寫字母,數字和減號組成的非空字串。
  該命令列工具的作者提供給你一個格式字串以指定他的命令列工具需要接受哪些選項。這個字串由若干小寫字母和冒號組成,其中的每個小寫字母表示一個該程式接受的選項。如果該小寫字母后面緊跟了一個冒號,它就表示一個帶引數的選項,否則則為不帶引數的選項。例如, "ab:m:" 表示該程式接受三種選項,即"-a"(不帶引數),"-b"(帶引數), 以及"-m"(帶引數)。
  命令列工具的作者準備了若干條命令列用以測試你的程式。對於每個命令列,你的工具應當一直向後分析。當你的工具遇到某個字串既不是合法的選項,又不是某個合法選項的引數時,分析就停止。命令列剩餘的未分析部分不構成該命令的選項,因此你的程式應當忽略它們。 輸入格式   輸入的第一行是一個格式字串,它至少包含一個字元,且長度不超過 52。格式字串只包含小寫字母和冒號,保證每個小寫字母至多出現一次,不會有兩個相鄰的冒號,也不會以冒號開頭。
  輸入的第二行是一個正整數 N(1 ≤ N ≤ 20),表示你需要處理的命令列的個數。
  接下來有 N 行,每行是一個待處理的命令列,它包括不超過 256 個字元。該命令列一定是若干個由單個空格分隔的字串構成,每個字串裡只包含小寫字母,數字和減號。 輸出格式   輸出有 N 行。其中第 i 行以"Case i:" 開始,然後應當有恰好一個空格,然後應當按照字母升序輸出該命令列中用到的所有選項的名稱,對於帶引數的選項,在輸出它的名稱之後還要輸出它的引數。如果一個選項在命令列中出現了多次,只輸出一次。如果一個帶引數的選項在命令列中出 現了多次,只輸出最後一次出現時所帶的引數。 樣例輸入 albw:x
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l 樣例輸出 Case 1: -a -l
Case 2:
Case 3: -w 15 -x
Case 4: -a -b

解題程式碼(java):

import java.util.Scanner;  
  
class Arg {  
    boolean hasPar;  
    boolean isAppear;  
}  
  
public class Main {  
  
    public static void main(String[] args) {  
        Scanner input = new Scanner(System.in);  
        Arg[] argues = new Arg[26];  
        for (int i = 0; i < argues.length; i++) {  
            argues[i] = new Arg();  
        }  
          
        char[] rule = input.nextLine().toCharArray();  
        for (int i = 0; i < rule.length; i++) {  
            if (rule[i] == ':')  
                argues[rule[i - 1] - 'a'].hasPar = true;  
            else {  
                argues[rule[i] - 'a'].isAppear = true;  
            }  
        }  
  
        int n = Integer.parseInt(input.nextLine());  
          
        StringBuilder[] result = new StringBuilder[n];  
        for (int i = 0; i < n; i++) {  
              
            result[i] = new StringBuilder("Case " + (i + 1) + ": ");  
            boolean[] isAppear = new boolean[26];  
            String[] parameter = new String[26];  
              
            String[] in = input.nextLine().split(" ");  
            for (int j = 1; j < in.length;) {  
                if (((in[j].length() != 2 || in[j].charAt(0) != '-')  
                        || (in[j].charAt(1) - 'a' < 0 || in[j].charAt(1) - 'a' > 25))  
                        || (!argues[in[j].charAt(1) - 'a'].isAppear)) {  
                    break;  
                }  
                char c = in[j].charAt(1);  
                if (argues[c - 'a'].hasPar) {  
                    isAppear[c - 'a'] = true;  
                    parameter[c - 'a'] = in[j + 1];  
                    j += 2;  
                } else {  
                    isAppear[c - 'a'] = true;  
                    j++;  
                }  
  
            }  
            for (int j = 0; j < 26; j++) {  
                if (isAppear[j]) {  
                    char temp = (char) ('a' + j);  
                    result[i].append("-" + temp + " ");  
                    if (argues[j].hasPar)  
                        result[i].append(parameter[j] + " ");  
                }  
            }  
        }  
        input.close();  
        for (int i = 0; i < n; i++) {  
            System.out.println(result[i].toString().trim());  
        }  
    }  
}  
可以得90分,但是執行錯誤,不知道怎麼回事,請教!