CCF-CSP 出現次數最多的數
問題描述
試題編號:201312-1 試題名稱:出現次數最多的數 時間限制:1.0s 記憶體限制:256.0MB 問題描述: 給定n個正整數,找出它們中出現次數最多的數。如果這樣的數有多個,請輸出其中最小的一個。 輸入格式 輸入的第一行只有一個正整數n(1 ≤ n ≤ 1000),表示數字的個數。 輸入的第二行有n個整數s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相鄰的數用空格分隔。 輸出格式 輸出這n個次數中出現次數最多的數。如果這樣的數有多個,輸出其中最小的一個。 樣例輸入 6 10 1 10 20 30 20 樣例輸出 10
題解1
最容易想到的辦法就是用陣列來記錄整數的出現次數,比如整數10出現的次數,用索引(下標)為10的陣列元素a[10]來記錄,出現 1 次 a[10] 的值即加 1,20則用a[20]來記錄,依此類推。當然,這個陣列的大小必須滿足題目的最大要求,整數小於等於10000,也就是說陣列必須要大於10000個元素,才能保證所有測試樣例全部通過。完成記錄以後,遍歷整個記錄陣列,找出陣列中最大的元素,記錄其索引值(下標),當出現出現次數相等的情況時,選擇較小的下標作為結果。
n = int(input())# 讀取輸入整數個數 a = list(map(int, input().split()))# 讀取輸入的整數,並存儲在列表裡 b = [0] * 10004# 標記整數出現次數的陣列 for i in a:# 遍歷輸入的整數列表 b[i] = b[i] + 1# 標記整數出現次數 m = 0 result = 0# 結果 for i in range(10004):# 遍歷整個計數陣列 if (b[i] > m) or (b[i] == m and result > i):# 記錄出現次數最多,且最小的整數 m = b[i]# 當前最大次數記錄更新 result = i# 記錄當前最大次數的索引,即我們的結果 print(result)# 輸出結果
題解2
改進第一種方法中的一個細節,就是關於出現次數相等情況的處理,由於最後是按從小到大的順利遍歷陣列,所以不需要處理相等的情況也可以保證選出的出現次數的最多的同時也是最小的。
n = int(input())# 讀取輸入整數個數 a = list(map(int, input().split()))# 讀取輸入的整數,並存儲在列表裡 b = [0] * 10004# 標記整數出現次數的陣列 for i in a:# 遍歷輸入的整數列表 b[i] = b[i] + 1# 標記整數出現次數 m = 0 result = 0# 結果 for i in range(10004):# 遍歷整個計數陣列 if b[i] > m:# 記錄出現次數最多,由於是按從小到大的順利遍歷陣列,所以不需要處理相等的情況 m = b[i]# 當前最大次數記錄更新 result = i# 記錄當前最大次數的索引,即我們的結果 print(result)# 輸出結果
題解3
這份程式碼確實比較分騷,充分利用了Python的內建函式來結題,在列表、元組和字典之間進行流暢地轉換:
n = int(input()) a = list(map(int, input().split())) b = list(set(a))# 利用集合的特性,轉換為集合,去掉其中相同數 b.sort()# 從小到大排序 s = dict(zip(b, map(a.count, b)))# 將數與它的出現次數組合再轉為字典 print(max(s, key=s.get))# 根據字典值選出count最大的數
知識點補充
- map() 函式
Python函式程式設計中的map()
函式是將func
作用於seq
中的每一個元素,並將所有的呼叫的結果作為一個list
返回。
map(func, seq1[, seq2,…])
第一個引數接受一個函式名,後面的引數接受一個或多個可迭代的序列,返回的是一個集合。
Python2 中:
>>>nums = map(int, input().split()) 19 7 8 25 >>>nums [19 7 8 25]
Python3中:
>>>nums = map(int, input().split()) 19 7 8 25 >>>nums <map object at 0x035A18F0>
如果也想實現python2的效果,需要這樣寫:
>>>list(nums) [19, 7, 8, 25]
在上面的題解3中,使用map()函式
結合list.count()
函式做統計:
>>>a = [10, 1, 10, 20, 30, 20] >>>b = [1, 10, 20, 30] >>>list(map(a.count, b)) [1, 2, 2, 1]
- zip() 函式
zip()
函式用於將可迭代的物件作為引數,將物件中對應的元素打包成一個個元組,然後返回由這些元組組成的列表。如果各個迭代器的元素個數不一致,則返回列表長度與最短的物件相同,利用 * 號操作符,可以將元組解壓為列表。
>>>a = [1,2,3] >>>b = [4,5,6] >>>c = zip(a,b) [(1, 4), (2, 5), (3, 6)] >>>zip(*c) [(1, 2, 3), (4, 5, 6)]
在上面的題解3中,使用zip()函式
將整數及其出現次數整合成元組:
>>>a = [10, 1, 10, 20, 30, 20] >>>b = [1, 10, 20, 30] >>>list(zip(b, map(a.count, b))) [(1, 1), (10, 2), (20, 2), (30, 1)]
- dict() 函式
dict()
函式用於建立一個字典。
dict(key/value)
key/value
– 用於建立字典的鍵/值對,可以為空、字典、關鍵字、包含元組的列表等,如下:
>>>dict()# 空字典 {} >>>dict({'fzy': 23})# 傳遞字典 {'fzy': 23} >>>dict(fzy=23)# 傳遞關鍵字 {'fzy': 23} >>>dict([('fzy', 23),('xsc', 22)])# 傳遞包含多個元組的列表 {'fzy': 23, 'xsc': 22} >>>dict(zip(['fzy', 'xsc'], [23, 22]))# 傳遞zip()函式 {'fzy': 23, 'xsc': 22}
在上面的題解3中,使用dict()函式
將由整數及其出現次陣列成的元組轉換成字典:
>>>a = [10, 1, 10, 20, 30, 20] >>>b = [1, 10, 20, 30] >>>dict(zip(b, map(a.count, b))) {1: 1, 10: 2, 20: 2, 30: 1}
- max() 函式
max()
函式返回給定引數的最大值,引數可以為序列。
>>> max([1, 2, 3]) 3
可以用max(dict,key=dict.get)
方法獲得字典dict
中value
的最大值所對應的鍵的方法,max(dict, key)
方法首先遍歷迭代器,並將返回值作為引數傳遞給key
對應的函式,然後將函式的執行結果傳給key
,並以此時key
值為標準進行大小判斷,返回最大值。
在上面的題解3中,使用max()函式
得到由整數及其出現次陣列成的字典中出現次數最大的整數:
>>>a = [10, 1, 10, 20, 30, 20] >>>b = [1, 10, 20, 30] >>>s = dict(zip(b, map(a.count, b))) >>>s {1: 1, 10: 2, 20: 2, 30: 1} >>>max(s, key=s.get) 10