数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
#include<iostream>
#include<vector>
#include<algorithm>//sort排序函数要用到
using namespace std;
int main()
{
int i;
cin>>i;
vector<int> a(i);//类似数组定义int a[ 10 ] /i是用来规定长度
for(int j=0;j<i;j++)//插入元素
cin>>a.at(j);
sort(a.begin(),a.end()); //sort 函数排序
int j = i;
vector<int> b(j); //创建一个和向量a 相同大小的向量b,用来计录a 中不同元素的出现次数
int maxcount,ncount; //ncount 计录每个元素出现的次数,maxcount是出现的最高次数
maxcount=ncount=1;
for(int i=0; i<a.size()-1; i++) //计录每个元素出现的次数并存入容器 vector<int>b 中
{
if(a[i] != a[i+1]) //元素不等
{
b[i]= ncount; //下标i 在b中是这个值出现的次数
if(ncount>maxcount)
maxcount=ncount;
ncount=1; //每显示一次后,要确保ncount初始为1
}
else{
ncount++;
}
}
for(int i=0; i<j;i++) //求出 > vector.size()/2 具体元素
{
if(b[i]== maxcount && maxcount*2 >j){
cout<<a[i]<<endl;
break;
}
else{
if(i == j-1) //保证只有一个 0输出
cout << "0" << endl;
}
}
return 0;
}
方法二
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int n=0;
for(int i=0;i<array.length;i++){
for(int j=i;j<array.length;j++){
if(array[i]==array[j]){
n++;
if(n>(int)(array.length/2)){
return array[i];
}
}
}
n=0;
}
return 0;
}
}
方法三:先把数组排序,如果存在一个数超过总数的一半,那么
这个数必然位于数组的最中间,然后统计它左右两边的与他相同的个数,
总和大于一半则返回中间值,否则返回0
int MoreThanHalfNum_Solution(vector<int> numbers) {
if (numbers.empty()) return 0;
sort(numbers.begin(),numbers.end());//排序
int length=numbers.size();
int targ=numbers[length/2];
int countt=0;
for (int i=length/2;i>=0;i--)
{
if (numbers[i]==targ)
countt++;
else
break;
}
for (int i=length/2+1;i<length;i++)
{
if (numbers[i]==targ)
countt++;
else
break;
}
if (countt>length/2) return targ;
else return 0;
}
vector&数组
最新推荐文章于 2023-06-16 20:45:50 发布