2011年8月26日 星期五

【Android】TQC+題組系列2(一)


說真的,很不希望抽到這題...

這題 layout 要自己拉自己抓,程式雖不算難但寫起來較複雜繁瑣,總合起來以一題30分鐘來算的話實在不太夠。

首先要先亂數產生解答的陣列,內容必須不重複。
int[] answerAry = { -1, -1, -1 };
for (int i = 0; i < answerAry.length; i++)
    answerAry[i] = createNoRepeatIntAry(answerAry);

private static int createNoRepeatIntAry(int[] ary) {
    int temp = (int) (Math.random() * 10);
    for (int i = 0; i < ary.length; i++)
        if (temp == ary[i])
            return createNoRepeatIntAry(ary);
    return temp;
}
這裡是用一個副程式遞迴去反覆求不重複於陣列元素的整數並寫入,寫這段程式的時候還發生我忘了在遞迴點打 return 導致 return 的結果一直是第一次產生的 temp 的問題,解這個問題就花了超過時間限制6倍的時間...

※Java 的亂數產生,如上,是使用 Math.random() 這個方法,它會產生0~1之間(包含0不包含1)的 double 亂數,所以 *10會變成產生0~9之間再把它轉成 int 就符合題目需求了。
※如果要從1~9就改成 Math.random() *10 +1,就會讓結果值至少為1了。

再來是由 EditText 取得的字串要逐字轉入整數陣列以便跟解答陣列比較,以下是我能想到最簡單的辦法...
char[] charAry = txt_inputNum.getText().toString().toCharArray();
int[] inputNumAry = new int[charAry.length];
for (int i = 0; i < charAry.length; i++)
    inputNumAry[i] = Character.getNumericValue(charAry[i]);
其中 Character.getNumbericValue() 這個 method 還是第一次用,因為直接用 (int)char 去轉換換出來的值是錯的,去查才發現要用這個方法。

然後是各種檢查,檢查輸入字元是否重複、是否>或<3個,對應的去變更下面的提示訊息與上面的輸入字串內容;然後是計算AB數,要注意自己用的運算方法B會不會重複算到A的部分,這些部份雖然做的過程沒有發生什麼重大錯誤,可是也是耗了很多時間,只能說怎麼算這題要30分鐘做好都很困難,祈禱不要抽到這題。

沒有留言:

張貼留言