【c语言】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}, 由于数组中数字2出现了5次,超过数组的长度的一半,因此输出2

一种办法是先把数组排序,那么超过一半的元素一定是数组最中间的元素。

第二种办法比较抽象,设一个变量保存当前值,设一个次数,当前值与下一个值进行比较,如果相等,次数加一,如果不相等,次数减一,如果次数减到0了还是不相等,就把当前值替换掉。代码如下:

#include <stdio.h>
#include <assert.h>

int find_half(int *arr, int len)
{
	int count = 0;
	int cur = 0;
	int i = 0;
	assert(arr != NULL);
	for (; i < len; ++i)
	{
		if (count == 0)
		{
			cur = arr[i];
			count = 1;
		}
		else if (arr[i] == cur)
			count++;
		else
			count--;
	}
	return cur;
}

int main()
{
	int arr[] = { 1, 2, 2, 2, 3, 2, 6, 2, 7, 2 };
	int len = sizeof(arr) / sizeof(arr[0]);
	printf("%d\n", find_half(arr, len));
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 21:59:06

【c语言】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字的相关文章

C++数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。

#include <iostream> #include <bitset> using namespace std; //数组中超过出现次数超过一半的数字(数组) //题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字. template<int _N> int Grial(bitset<_N> &bt,int a[]) { int check[_N]; for(int i=1;i<=_N;i++) { int count =

在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。

题目:在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素.要求:(1)给出算法的基本设计思想.(2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释.(3)说明你所设计算法的时间复杂度和空间复杂度. (1)基本的设计思想: 一个数字出现的次数超过了长度的一半, 那么我们可以这样认为这个数字出现的个数一定大于其他全部数字出现的个数之和.算法的步骤如下: ①设数组为data[],数组长度为n,i=1.置currentAxi

C++数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。(牛客剑指offer)

///////////////////////////////////////////////////////// //数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. //例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}. //由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. #include <iostream> using namespace std; int Grial(int a[],int n) { if(n==0)return -1;

数组中有一个数字出现的次数超过了数组长度的一半,找出这个数

这个算法的时间复杂度是O(n),另外用了两个辅助变量. k用于临时存储数组中的数据,j用于存储某个数出现的次数. 开始时k存储数组中的第一个数,j为0,如果数组出现的数于k相等,则j加1,否则就减1,如果j为0,就把当前数组中的数赋给k 因为指定的数出现的次数大于数组长度的一半,所有j++与j--相抵消之后,最后j的值是大于等于1的,k中存的那个数就是出现最多的那个数. 下面这个算法只适合数组中数组中某个数的出现次数超过数组长度一半的数组,符合题意. c实现 1 #include<stdio.h

数组中有一个数字出现的次数超过数组长度的一半

1 /* 2 ----------------------------------- 3 动态分配需要的内存大小 4 输入数组元素的值 5 通过函数调用,传地址对数组排序 6 循环每个元素,当循环比较某个值时,如果有相等的,计数加1,比较完成后,和cn比较,如果大于cn,那么说明找到,退出循环 7 ----------------------------------- 8 */ 9 10 # include <stdio.h> 11 # include <malloc.h> 12

一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。(使用位运算)

#include <stdio.h> int main() {      int arr[5];      int i,j;      int len=sizeof(arr)/sizeof(arr[0]);     //初始化数组      for(i=0;i<len;i++)            {        scanf("%d",&arr[i]);      }     //查找的过程      j=arr[0];     for(i=1;i<

数组中次数超过数组长度一半的数字

问题:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 分析:看到此题第一反应就是将数组中的数字进行排序,然后统计数字出现的次数.排序的时间复杂度为O(nlogn). 从另一个角度出发,数组中有一个数字出现的次数大于数组长度的一半,也就是说它出现的次数比其他数字出现次数之和还要多.因此可以在遍历数组的时候保存两个值:(1)保存数组中的值:(2)保存数字出现的次数. 步骤:(1)当遍历的下一个数字与之前保存的数字不同时, 将次数减1: (2)当遍历的下一个数字与之前保存的数字相同时,

数组中出现次数超过数组长度一半的数字

题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 解法一:若条件满足则这个数字在排序后的数组中必在最中间,所以把这个数字统计次数后和数字的一半长度比较后,若大于则满足条件,否则不满足.因涉及到快排,故时间复杂度时O(nlgn) class Solution { public: int MoreThanHalfNum_Solut

数组中出现次数超过数组长度一半的值

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.比如输入一个长度为18的数组{1,0,2,6,1,0,1,1,5,2,1,1,1,3,1,1,5,1}, 因为数组中数字1出现的次数超过数组的长度的一半,因此输出1. 1)最直接的办法是先把数组排序,那么超过一半的元素一定是数组最中间的元素. 2)再深入思考一下就会想到高速排序过程,利用partion找出index==middle时,index相应的值,而不必全然排序. 3)另外一种办法比較抽象,设一个变量保存当前值,设一个次数