2013年9月4日 星期三

[UVA]Common Permutation

CPE 10567、UVA 10252程式解題。












































解題觀念:


這題主要是統計兩個字串a~z字元的個數,然後去做比較。

並且要依照a~z的順序,印出個數較少的字元。(個數為0的字母不用比較)

所以最重要的兩件事:

1.統計
2.比較大小

另外,如果最少個數的字母有2個以上,則依照字母順序印出。
(例如a和b都為1,且都是最少個數的字母,則印出ab)

最後一個重點就是,如何將字母存進陣列統計??==>比如陣列0的位置代表a,1為b,2為c等。

思考一下,再來看下面的解題步驟吧~(提示:字母a~z小寫的ASCII碼)



解題步驟:(**簡單的for迴圈控制我就不多加說明囉!!)

宣告兩個陣列,分別儲存兩個字串a~z字元的個數。(count_a[]、count_b[])

在宣告一個陣列,在後面用來找出個數最少的那個字母。(ans[])

以防萬一,輸入的字串s,我多加一個語法(trim()),去除字串中的空白。(預防一下心機測資)

好,接下來就要解釋將字母存進陣列的辦法。

陣列的格子都是以數字命名,所以要將抓取到的字母強轉為ASCII碼後,再存入陣列中。

語法:count_a[(int)(s.charAt(i)-'a')]

例如抓取到的字母為a,將a的ACSII碼減掉a的ASCII碼等於0,存入陣列0的位置,以此類推,b的ACSII碼減掉a的ASCII碼等於1,存入1的位置,這樣就可以設定26個字母各自的房間了!

之後比較大小,因為是要印出個數最少的字母,所以比較哪一個比較小

Java裡面有一種數學函式可以直接使用,是的,看到上面的程式碼就知道了吧~~

語法:Math.min(count_a[],count_b[])

之後在將字母ASCII碼強轉為字母,印出。(要記得轉換回字母喔!!)



EX:
(為了方便我只取pretty作範例)
pretty
woman

pretty進入for迴圈,抓取第一個字元,p的ASCII碼為70,減掉a的ASCII碼60,等於9 =>存入count_a[9],count_a[9]=1。

之後繼續抓取後面的字元,存入相對應的格子裡。woman所做的動作也是一樣的。

處理完之後,在做比較大小。用for迴圈去尋找個數最少的字母,然後存放到ans[]。

結果為count_a[4]、count_b[4],字母e出現次數最少,將e的ASCII碼強轉為字母之後,印出。


BY 小K

沒有留言:

張貼留言