1. 程式人生 > 其它 >出現次數最多的整數

出現次數最多的整數

技術標籤:藍橋杯練習題c++演算法

資源限制

時間限制:1.0s 記憶體限制:512.0MB

問題描述

編寫一個程式,讀入一組整數,這組整數是按照從小到大的順序排列的,它們的個數N也是由使用者輸入的,最多不會超過20。然後程式將對這個陣列進行統計,把出現次數最多的那個陣列元素值打印出來。如果有兩個元素值出現的次數相同,即並列第一,那麼只打印比較小的那個值。

輸入格式

第一行是一個整數N,N £ 20;接下來有N行,每一行表示一個整數,並且按照從小到大的順序排列。

輸出格式

輸出只有一行,即出現次數最多的那個元素值。

輸入輸出樣例

樣例輸入
5
100
150
150
200
250
樣例輸出

150

題目簡析

關鍵字:整數 從小到大排列 只打印比較小的那個值

正解程式碼

#include<iostream>

using namespace std;

int main(){
    int n;
    cin>>n;
    int times = 0;
    int max_times = 0;
    int x;
    int before;
    int temp = -99999;
    if(n <= 0){
        return 0;
    }
    while(n--){
        cin>>x;

        if
(x != temp){ if(times > max_times){ max_times = times; before = temp; } temp = x; times = 1; }else{ times++; } } if(times > max_times){ cout<<x<<endl; }else
{ cout<<before<<endl; } }

以上程式碼按著很簡單,但是是通過踩坑寫出來的。

if(n<=0)

題目並沒有給出n的取值範圍,所以要自行判斷!(好陰險)

彎路歷程

由於之前寫的時候並沒有仔細看題,所以還有一個版本:

#include<iostream>

using namespace std;

int a[21][2];

int main(){
    int n, temp;
    int len = 0;
    cin>>n;
    for(int i = 0; i < n; i++){
        cin>>temp;
        if(i == 0){
            a[i][0] = temp;
            a[i][1]++;
            len++;
        }else{
            int flag = 0;
            for(int j = 0; j < i; j++){
                if(a[j][0] == temp){
                    a[j][1]++;
                    flag = 1;
                }
            }
            if(flag == 0){
                a[i][0] = temp;
                a[i][1]++;
                len++;
            }
        }
    }
    
    int num = a[0][0];
    int max_num = a[0][1];
    int temp_i = 0;
    for(int i = 0; i < len; i++){
        if(a[i][1] > max_num){
            num = a[i][0];
            max_num = a[i][1];
        }else if(a[i][1] == max_num && a[i][0] < num){
            num = a[i][0];
            max_num = a[i][1];
        }
    }
    cout<<num;

}

這個版本適合在亂序排列的一組資料中找出出現次數最多且並列較小的數字,
能過這題,但沒有這樣寫的必要。

本來想隨便寫寫這題,沒想到還是得認真看題。