主題

ZeroJudge - d634: 魔法卡magic 解題心得

Not In My Back Yard | 2021-02-07 00:00:07 | 巴幣 0 | 人氣 21

題目連結:


題目大意:
輸入第一列給定一正整數 n (1 < n ≦ 100000),代表有 n 個字串(可能包含空白、數字以及英文字母,每個字串不超過 10 個字元)。接著有 n 列輸入,每列代表一個字串之內容。

請將這 n 個字串按照字典序排序後各自輸出,參見範例輸出。

字典序之定義:
對於兩個字串,先比較兩者第一個字元(最左字元)之 ASCII 編碼下的值,較小的在前;如果一樣,則比較第二個;如果還是一樣就比較第三個,以此類推。

如果比到後來都一樣,但是有一字串先行結束了(代表該字串較短),則較短之字串在前。



範例輸入:
7
penguin
jacker
jack doom
JACK
ws23
aszx87140
e196819


範例輸出:
JACK
aszx87140
e196819
jack doom
jacker
penguin
ws23


解題思維:
本題看起來相當單純,就是輸入字串、排序字串、輸出字串,再加上不少語言又內建的字串排序函式(C++ 、 Java 都有),哪裡能出錯呢?

如果你用的是 Java 這語言可能還不會有這問題,但是如果是 C++ ,你如果沒寫好輸入,例如:
cin >> n >> ws;
那麼你應該會在 #1 這個測資點出錯,因為 ws 這個物件會吃掉輸入 n 之後的所有空白字元(包含換行字元),但是很剛好的是下一列就是一個開頭是空白字元的字串(注意本題的輸入字串可以出現空白字元)。

如果讀者是真的使用 C++ 而且看到錯誤訊息是:
您的答案為: 4a
正確答案為: 5a
那麼就表示您八成犯了上面的失誤(像我)。

建議要刪除第一次輸入後面多餘的空白或是換行字元而不影響下一列的輸入,可以寫成:
cin >> n;
getline(cin, str);
這種形式(其中 str 是一個字串或字元陣列)。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作