數據結構實訓(一)--- 數組主元素(2013考研題)


【問題描述】
已知一個整數序列A長度為N其中若存在a且a的個數大於N/2則稱為A的主元素
例如0 5 5 3 5 7 5 5 則為主元素 5
又如0 5 5 3 5 1 5 7則中沒有主元素。
假設的元素保存在一個一維數組中,請設計一個盡可能高效的算法,找出的主元素。若存在主元素則輸出該元素否則輸出-1。

【輸入形式】
一個整數數組
【輸出形式】
主元素
【樣例輸入】
0 5 5 3 5 7 5 5
【樣例輸出】
5
【樣例說明】
長度為8,共有5個5。

個人方法:(暴力破解)

#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;

int main()
{
    vector<int> input;
    int num;
    char ch;

    // 接收數據 並壓入向量
    do
    {
        cin >> num;
        input.push_back(num);
    }
    while( (ch=getchar()) != EOF && ch != '\n');

    // 雙層遍歷統計 每個數的次數
    for (int j=0; j<input.size(); j++)
    {
        int cont = 0;   // 出現次數變量初始化

        for(int i=j; i<input.size(); i++) // 從a[j]開始,對其后面出現次數進行計數
        {
            if(input[i] == input[j])
            {
                cont++;
            }
        }

        if(cont*2>input.size()) // 滿足條件程序結束
        {
            cout<< input[j];
            return 0;
        }
    }
    cout << "-1";
    return 0;
}

老師講解

#include<iostream>
#include<sstream>
using namespace std;

int main()
{
    string line;
    getline(cin, line);     // 獲取一行輸入
    istringstream ss(line); // 轉換為輸入流

    int a[100];
    int N = 0;
    while(ss>>a[N])     // 輸入流內容 傳入 a[N] 類似cin輸入
    {
        N++;
    }

    int cont[N]= {0};   // 開辟與輸入數據相同的大小的數組 並初始化為0 用來計數
    for(int i=0; i<N; i++)
    {
        cont[a[i]]++;   // cont數組計算 值為a[i] 的出現次數
        if(cont[a[i]]>N/2)  // 判斷cont數組 中a[i] 的出現次數 若滿足條件程序退出
        {
            cout << a[i];
            return 0;
        }
    }
    cout << "-1";
    return 0;
}

個人總結:

  以cont數組中的下標與輸入數組中的值進行映射關系,充分利用兩數組數組之間的關系進行解題。

知識拓展:

  c++中,未知數據量進行數據讀入,可采用老師講解的方法。 c語言中可采用個人方法中的代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM