題目連結
題意:
要統計所有英文字母的出現個數(大小寫視為一樣的)
由個數多至少列出(每行輸出大寫字母與個數)
若相同則按A~Z的順序
本題只會有一組測資
測資先給行數,依序是每行的若干字元
解法:
由於大小寫需看成相同的
我們先將題目所有字元轉成大寫(ToUpperCase())
開一個陣列來統計各字母的出現次數
有點偷懶的地方是
可以用字母的ASCII當陣列的索引(index)
如 15 行 讀到 A~Z 的範圍後,假設是 A
16 行 直接在陣列的 c['A'] 加1 (也就是 c[65])
第6行宣告陣列大小只要比 'Z' 還大就好
(當然陣列大小也可以只有26,記得字元轉換數字index要扣 'A')
輸出時,因為題目要求依個數大到小順序
個數至多就是測資的總字元數吧
(如題目是 30個 A,就只會輸出 A 30,不會超過)
所以在20行,從個數 len 開始
讀到某個數值就按 A~Z的順序去跑
就可以題目要求的方式輸出了
程式(Java):
題意:
要統計所有英文字母的出現個數(大小寫視為一樣的)
由個數多至少列出(每行輸出大寫字母與個數)
若相同則按A~Z的順序
本題只會有一組測資
測資先給行數,依序是每行的若干字元
解法:
由於大小寫需看成相同的
我們先將題目所有字元轉成大寫(ToUpperCase())
開一個陣列來統計各字母的出現次數
有點偷懶的地方是
可以用字母的ASCII當陣列的索引(index)
如 15 行 讀到 A~Z 的範圍後,假設是 A
16 行 直接在陣列的 c['A'] 加1 (也就是 c[65])
第6行宣告陣列大小只要比 'Z' 還大就好
(當然陣列大小也可以只有26,記得字元轉換數字index要扣 'A')
輸出時,因為題目要求依個數大到小順序
個數至多就是測資的總字元數吧
(如題目是 30個 A,就只會輸出 A 30,不會超過)
所以在20行,從個數 len 開始
讀到某個數值就按 A~Z的順序去跑
就可以題目要求的方式輸出了
程式(Java):
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.*; | |
public class Main { | |
public static void main(String args[]) { | |
Scanner sc = new Scanner(System.in); | |
int c[] = new int[300]; | |
int len = 0; | |
int n = Integer.valueOf(sc.nextLine()); | |
while (n-- > 0) { | |
String s = sc.nextLine(); | |
len += s.length(); | |
s = s.toUpperCase(); | |
for (int i = 0; i < s.length(); i++) { | |
if (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z') | |
c[(int)s.charAt(i)]++; | |
} | |
} | |
while (len-- > 1) { | |
for (int i = 'A'; i <= 'Z'; i++) | |
if (c[i] == len) | |
System.out.println((char)i + " " + len); | |
} | |
} | |
} |
請問一下第6行為甚麼值要給300
回覆刪除這題我們最多只要記錄A~Z的個數,總共26個就好
回覆刪除所以我們開一個陣列
原本可能會讓 c[0]代表A, c[1]代表B ... 依此類推
再來,我要在讀到英文字後知道該放在哪個位置
也就是根據他們的ASCII
A~Z對應的ASCII是65~90
得到後還要扣掉65才是陣列 c[0] ~ c[25]的位置
因此,如果陣列直接開到90以上
反正我只會用到65~90,其他不管
如第16行的寫法
強制轉型後就可以直接對到第65~90的位置了
不用怕忘記扣掉或是多一個轉換容易出錯
其實300也是我任意設的數字,開大了也不影響^^
不好意思想請教第12行的意思,與第16行的++是甚麼意思
回覆刪除