【问题描述】
已知一个整数序列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语言中可采用个人方法中的代码。