c++题目:求出现次数超过一半的数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++题目:求出现次数超过一半的数相关的知识,希望对你有一定的参考价值。

给出一个含有n个整数的数组,请找出其中出现次数超过一半的数(n <= 1000)。
数组中的数大于-50且小于50。
输入的第一行包含样例的组数m。
此后有m组样例,每组样例的第一行包含数组大小n,第二行上是这n个整数。
如果存在这样的数,输出这个数;否则输出”no”。
例子输入
2
2
1 2
3
1 2 2
例子输出
no
2

我根据楼主的想法大概做了一个小程序,时间比较紧,已经实现了计算每个数出现的次数,至于是不是超过一半,这个应该不需要我写了,楼主自己来吧。

#include <iostream>
using namespace std;

void count(int *arr,int n)

//n为数组个数,a为当前数,,j为a第一次出现的位置
//int sum = 1;
int a = arr[0];
int j = 0;
for(int i = 1; i < n; i++)

if(i == n-1)

cout<<arr[i]<<"的个数为:"<<i-j<<endl;

if(arr[i] != arr[i-1])

cout<<a<<"的个数为:"<<i-j<<endl;
a = arr[i];
j= i;




void sort(int*a, int n)

for(int i=0; i<n-1; i++)

int k = i;//最小值的下标
for(int j=i; j<n; j++)

if(a[j]<a[k]) k = j;

if(k!=i)
swap(a[k], a[i]);



int main(int argc, char* argv[])

int *arr;
int m;
cout<<"请输入个数:"<<endl;
cin>>m;
cout<<"请输入"<<m<<"个整数:";
if (m<=0 || m>1000)

return 0;

arr = new int[m];
for(int i = 0; i < m; i++)

int elment;
cin>>elment;
arr[i] = elment;


cout<<endl;

sort(arr,m);

cout<<"排序结果为:"<<endl;
for(int i = 0; i < m; i++)

cout<<arr[i]<<" ";

cout<<endl;

count(arr,m);

system("pause");
return 0;
参考技术A #include <iostream>
using namespace std;

struct node

int data; //数值
int count; //计数
test[100];

void initNode()//初始化数组

for(int i=0; i<100; ++i)

test[i].data = 50;
test[i].count = 0;



/*如果已经存在dada这个数,就先找出来,并返回是第几个数*/
int find(int data,int num)

for (int i=0; i<num; ++i)

if (data == test[i].data)

return i;


return 0;


int main(int argc, char* argv[])

int n;//几组数据;
cin>>n;
while(n--)

int m; //这组有几个数
cin>>m;
initNode();
int num = 0; //计输入数据的个数
int realNum = 0;//实际有多少个不重复的数
while(num < m)

int temp;
cin>>temp;
int result = find(temp,num);
if (result)

test[result].count++;

else

test[num].data = temp;
test[num].count = 1;
realNum++;

num++;

int hasNo = 0;//记录有没有满足条件的数
for(int i=0; i<realNum; ++i)

if(test[i].count > m/2)

hasNo = 1;
cout<<test[i].data<<" ";


if(hasNo == 0)
cout<<"no"<<endl;
else
cout<<endl;

return 0;
本回答被提问者采纳
参考技术B 只有100种 数字的话,用另一个数组来保存每个数字的出现次数就好了

剑指offer系列54---数组中出现次数超过一半的数

【题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
* 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。
* 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
* 【思路】首先取第一个数,之后的数与其比较。相同次数+1;不同次数-1.次数=0的时候将第一个数改为次数保存并将次数设置为1.
* 这里要考虑到如果出现次数最多的数字没有达到一半的话,就返回0;

 1 package com.exe11.offer;
 2 
 3 /**
 4  * 【题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
 5  *           例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。
 6  *           由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
 7  * 【思路】首先取第一个数,之后的数与其比较。相同次数+1;不同次数-1.次数=0的时候将第一个数改为次数保存并将次数设置为1.
 8  *                这里要考虑到如果出现次数最多的数字没有达到一半的话,就返回0;
 9  * @author WGS
10  *
11  */
12 public class MoreThanHalfNumber {
13     
14     boolean isValid=true;//全局变量用来表示次数没有一半情况
15     
16     public int getMoreThanHalfNumber(int[] nums){
17         
18         if(nums==null || nums.length<=0) return 0;
19         int index=0;
20         int times=0;
21         int target=nums[index];
22         
23         while(index<nums.length){
24             if(times==0){
25                 target=nums[index];
26                 times=1;
27             }else if(nums[index]==target){
28                 times++;
29             }else{//nums[index]!=target
30                 times--;
31             }
32             index++;
33         }
34         //如果出现次数最多的数字没有达到数组长度一半的话,就返回0;
35         int times2=0;
36         for(int i=0;i<nums.length;i++){
37             if(nums[i]==target){
38                 times2++;
39             }            
40         }
41         if(2*times2<=nums.length){
42             isValid=false;
43             return 0;
44         }
45         
46         System.out.println(isValid);
47         return target;
48                 
49     }
50     
51     public static void main(String[] args) {
52         MoreThanHalfNumber m=new MoreThanHalfNumber();
53         int[] nums=new int[]{1,2,3,2,5,4,2};
54         int n=m.getMoreThanHalfNumber(nums);
55         System.out.println(n);
56     }
57 }

 

以上是关于c++题目:求出现次数超过一半的数的主要内容,如果未能解决你的问题,请参考以下文章

数组中出现次数超过一半的数字(C++剑指Offer详解)

数组中出现次数超过一半的数字(Python and C++解法)

1186:出现次数超过一半的数

数组中出现次数超过一半的数

剑指offer系列54---数组中出现次数超过一半的数

剑指Offer 39 - 数组中出现次数超过一半的数