CCF-201403-3-命令列選項
阿新 • • 發佈:2018-12-01
第三題一如既往的是模擬題,這次模擬解釋命令列。做第三題的心態就是:不要被題目嚇到,不用急,慢慢看完就好,最後注意細節。這一題規則很清晰,難度適中。
題目大意
給一個格式化字串(每個字母是一個選項),再給出幾個命令列,看每個命令列裡面哪些選項符合就輸出哪些,遇到不符合的就結束分析
思路
- 先把選項分類好。一種是不帶引數型別(列表儲存),另一種是帶引數型別(儲存資料結構因人而異,python用字典,java用map,反正要可以儲存帶引數選項的引數)
- 處理命令列,一個個選項看,如果該選項是帶引數型別的,讀取後面的引數,更新選項的引數值,把引數加入ans(答案列表,儲存不重複的選項);如果選項是不帶引數型別的,看是否已經加入過ans,沒有就加入。
- 最後遍歷ans,如果選項是帶引數型別輸出選項同時輸出引數,不帶引數型別只輸出選項
- 細節:注意帶引數型別的引數,組成字元可以是符號‘-’,字母和數字,還有處理格式字串和命令列選項的時候,注意不要溢位。
format_str = input() no_arg_opt = [] has_arg_opt = {} # 處理格式字串,分類 idx = 0 while idx < len(format_str): if idx + 1 < len(format_str) and format_str[idx + 1] == ':': has_arg_opt[format_str[idx]] = '' idx += 2 else: no_arg_opt.append(format_str[idx]) idx += 1 # 處理命令列 n = int(input()) for i in range(n): line = input().split()[1:] ans = [] # 正確匹配到的操作 idx = 0 while idx < len(line): op_or_arg = line[idx] # 如果是操作 if op_or_arg[0] == '-': # 帶引數的操作 if op_or_arg[1] in has_arg_opt: # 找到引數,更新字典,加入ans if idx + 1 < len(line): has_arg_opt[op_or_arg[1]] = line[idx + 1] if op_or_arg[1] not in ans: ans.append(op_or_arg[1]) idx += 2 # 不帶引數的操作,不重複項才加入ans else: if op_or_arg[1] in no_arg_opt: if op_or_arg[1] not in ans: ans.append(op_or_arg[1]) else: break idx += 1 # 不是操作,結束分析 else: break # 處理ans,按升序輸出操作如果是帶引數的操作,輸出後面帶引數 print('Case {}: '.format(i + 1), end='') ans = sorted(ans) for op in ans: if op in has_arg_opt: print('-{} {}'.format(op, has_arg_opt[op]), end=' ') else: print('-{}'.format(op), end=' ') print() # 測試用例 # albw:x # 4 # ls -a -l -a documents -b # ls # ls -w 10 -x -w 15 # ls -a -b -c -d -e -l # albxw: # 4 # ls -a -l -a documents -b # ls # ls -w 10 -x -w -15 -w # ls -a -b -c -d -e -l