2022/06/12 數字遊戲

2022.12.07 PM 09:00 by CBJ

來源 : https://zerojudge.tw/ShowProblem?problemid=i399
出題者 : 2022年6月APCS
標籤 : 眾數、去重、排序、(Python)套件應用
難易度 : 2
解題想法 : 
依照題意一一實作即可,以下分為數個部分說明 :
1. 計算眾數
。C/C++ - 使用陣列紀錄出現次數 (times[i] = i出現的次數,預設清0,每次遇到就++),並求陣列中最大值輸出。
。Python - collections套件的Counter() + most_common()。 (可參考中譯版官方文件 : https://docs.python.org/zh-tw/3/library/collections.html#collections.Counter)

2. 去重&排序
。C - 排序使用qsort(),比較函式return值加一個負號,再來跑一個for i並開陣列紀錄是否出現過,假如沒出現過就輸出,並記錄成有出現過,否則跳過,如此一來即完成排序&去重輸出。(qsort()用法可參考此處的註解部分https://github.com/CBJ0519/CBJsProgramDiary.com/blob/main/zj/d221.c)
。C++ - 使用set<int,greater<int>>,並將陣列內容丟入,即完成去重&排序(由大到小)。
(關於set用法可參考 : https://sites.google.com/site/zsgititit/home/jin-jiec-cheng-shi-she-ji/stl/set)
。Python - 使用set,並對set排序(Python的set是無序的),在sort中傳入reverse參數並設為True即可從大到小排列,即完成去重&排序。

3.輸出
C - (步驟2已做完)
C++ - 遍歷set即可
Python - 將most_common()[0][1](想了解原因可以透過輸出most_common()來觀察)和排序後的set輸出。
//C language

#include<stdio.h>
#include<stdlib.h> //qsort()
int cmp(const void* a,const void* b){
    return -(*(int*)a - *(int*)b);  //由大到小排序要加上負號
}
int main(){
    int a[3],times[10]={0};
    scanf("%d%d%d",&a[0],&a[1],&a[2]);
    for(int i=0;i<3;i++) times[a[i]]++;
    int ans=0;
    for(int i=0;i<10;i++) ans=((ans<times[i])?times[i]:ans);
    printf("%d ",ans);
    qsort(a,3,sizeof(int),cmp);
    int not_only[10]={0}; //true / false 
    for(int i=0;i<3;i++){
        if(not_only[a[i]]) continue;
        not_only[a[i]]=1;
        printf("%d ",a[i]);
    }
    return 0;
}
//C++ language

#include<iostream>
#include<vector>  //vector
#include<algorithm>  //max(), sort()
#include<set> //set
using namespace std;
int main(){
    vector<int>num,times(10,0);
    for(int i=0;i<3;i++){
        int x; cin>>x;
        num.push_back(x);
    }
    for(int i:num) times[i]++;
    int ans=0;
    for(int i:times) ans=max(ans,i);
    cout<<ans<<" ";
    set<int,greater<int>>st;
    for(int i:num) st.insert(i);
    for(int i:st) cout<<i<<" ";
    cout<<"\n";
    return 0;
}
## Python language

from collections import Counter
L=[int(x) for x in input().split()]
a=Counter(L).most_common()
print(a[0][1],end=' ')
b=sorted(set(L),reverse=True)
for i in b:
    print(i,end=' ')

相關文章