【問題描述】
已知一個整數序列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語言中可采用個人方法中的代碼。