解題觀念:
這題要稍微查一下ASCII碼,輸入字串,找出每一個字元的ASCII碼,並統計出現次數。
題目有標明範圍是從32~128,所以可以很放心地設定陣列大小。
出現次數由小到大印出,如果次數相同則ASCII碼大者先印出。
這題還有一點要注意的就是,每組測試資料間要輸出一行空白列。
解題步驟:
宣告字串str,讓使用者輸入。
宣告陣列save[],用來當做存放字元的格子,並統計次數。
宣告字元c,抓取字串中的字元。
宣告整數count,統計字元的總個數。
宣告布林變數deal,用來判斷是否要印出空白列,初始值設定為false。
剛開始的第一組資料還不用印出空白列,所以deal = false,不印出。
輸入的測試資料有可能包含空白,所以用naxtLine()讀取。
設定for迴圈,抓取字元,並存入陣列格子;由於ASCII碼從32開始,所以將其減掉32,從零開始存入格子。
每讀取一個字元,count就加1。
設定另一個雙層for迴圈,外層迴圈起始值從1開始遞增到count值為止,將ASCII碼出現次數由小到大印出;內層迴圈起始值從96(ASCII碼最大者)開始往下遞減,如果碰到次數相同則將ASCII碼較大者印出。
*印出時記得將字元轉成ASCII碼數字 (s+32)。
之後將該格子初始化,以便下一組資料儲存。
迴圈結束後,將count初始化;並將deal 設定為 true,如果有下一組資料,則回到上面if判斷式成立,會印出空白列。
EX:
AAABBC
進入if判斷式,deal = false,不成立,不印空白列。
str = AAABBC
進入for迴圈,抓取字元 c = A,存入陣列 save[A-32] = save[65-32] = save[33]++;之後count++。
再繼續執行for迴圈,...(以下省略)。
執行完結果,save[33] = 3;save[34] = 2;save[35] = 1;count = 6。
進入雙層for迴圈,外層迴圈起始值從1開始遞增到count值為止,內層迴圈起始值從96開始往下遞減;
僅入if判斷式,...(直接跳到35),s[35] == 1,成立,印出。 之後初始化-->save[35] = 0。 (其他字元以此類推)
結束迴圈後,count = 0;deal = true。(如果有下一組側資,則if(deal)會成立,印出空白列)
By 小K
沒有留言:
張貼留言