CPE10402、UVA10008 程式解題。
解題觀念:
這題要輸入句子後,統計各個字母的出現次數,且不分大小寫。
所以要處理字母大小寫,看是要全部轉成小寫還是全部轉成大寫。
依照出現次數由大到小印出,如果次數相同,則先印出排序較前的字母。次數為0不印出。
一個句子裡面可能會有空白列,所以要讀取( .nextLine() )並處理空白。
(此版本為第一次寫出的程式版本,未整理可能有些許瑕疵。)
解題步驟:
宣告整數a,讓使用者設定要輸入幾句句子;整數MAX,統計總共有幾個字母。
宣告字串s,存放句子;宣告字元c,等等抓取字元後存放用。
宣告陣列count,存放各個字母並統計次數。
整數a,輸入要有幾個句子。同時為for迴圈次數設定。
字串s,輸入句子,將所有空白處理掉( .replaceAll() ),再將全部轉為大寫( .toUpperCase() )。
進入for迴圈,讀取字元後設定給c。
進入if判斷字元c是否為A~Z字母,如果是則存放到相對應的陣列格子,並統計次數。
( if c=A,count[A-'A'] = count[65-65] = count[0] ,其他字母以此類推。)
MAX要統計所有字母的個數,所以每當讀取到一個字母就要+1。
處理完所有句子後,進入下一個雙層for迴圈,執行印出動作。
從MAX開始往下遞減,判斷陣列的格子從A開始到Z,是否有對應到相同次數。
因為是從最大次數向下遞減,所以會依照出現次數由大到小印出;
陣列格子也從A開始判斷,所以能夠依照排順序依序印出。
( * 要記得將 j 強轉成字元,不然直接輸出會是數字。)
EX:
1
To be or not to be.
將所有空白去除==>Tobeornottobe.
轉成大寫==>TOBEORNOTTOBE.
進入for迴圈,讀取字元,c = T。 進入if判斷式,T>=A && T<=Z,成立。
存入陣列,coumt[T-'A'] = count[84-65] = count[19] ++。MAX ++。
( 其他字母以此類推,我就跳過囉! )
進入下面雙層for迴圈,此時MAX = 13。
從13開始往下遞減,進入內層for迴圈,從A格子開始對應次數。
如果符合判斷式則印出,不符合則continue。
By 小K
沒有留言:
張貼留言