2014年1月6日 星期一

[UVA]Tell me the frequencies!

CPE 10410、UVA 10062 程式解題。











































解題觀念:

這題要稍微查一下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



沒有留言:

張貼留言