输入n个整数,输出出现次数大于等于数组长度一半的数

题目:输入n个整数,输出出现次数大于等于数组长度一半的数

输入描述:
NOWCODER.COM
牛客网·互联网名企笔试/面试题库
牛客出品-http://www.nowcoder.com
每个测试输入包含 n个空格分割的n个整数,n不超过100,其中有一个整数出现次数大于等于n/2。
输出描述:
输出出现次数大于等于n/2的数。
示例1:
输入
3 9 3 2 5 6 7 3 2 3 3 3
输出
3

分析:

方法(1):排序,中间那个数就是.

方法(2):对每个元素出现的次数做统计(统计次数的数组的大小:最大元素-最小元素)当然对于本题已知一共不到100个元素,可以直接开100个空间,并且count数组不用相对位置更简单

方法(3):我们可以分析,一个数出现次数超过一半,那么剩下所有元素出现次数之和小于一半,那么我们遍历数组的时候,保存两个值,一个元素,一个是次数,当遍历到下一个元素时,如果和当前元素相同,就将次数加1,否则将次数减1,如果次数被减到0,那么需要保存下一个数字并且将此时的次数置为1,这样下去,最后保存的数字一定是出现次数最多的那个数字(因为次数小于一般的其它元素将会抵消一部分次数大于一半的,但是次数大于一半的那个数字终究会剩一部分出来,这部分至少是1)。

int more_half_count1(vector<int>& v)
{
	sort(v.begin(), v.end());//默认升序
	return v[v.size() / 2];
}
int more_half_count2(vector<int>& v)
{
	//int max = v[0];
	//int min = v[0];
	//for (int i = 1; i < v.size(); i++)//找最大、最小值
	//{
	//	if (v[i] > max)
	//	{
	//		max = v[i];
	//	}
	//	if (v[i] < min)
	//	{
	//		min = v[i];
	//	}
	//}

	//int len = max - min + 1;//统计次数的数组
	//int* count = (int*)malloc(sizeof(int)*len);
	//memset(count,0,sizeof(int)*len);

	////初始化count数组
	//for (int i = 0; i < v.size(); i++)
	//{
	//	count[v[i] - min]++;
	//}

	////找次数超过一半的元素
	//for (int i = 0; i < len; i++)
	//{
	//	if (count[i] >= v.size() / 2)
	//	{
	//		return i + min;
	//	}
	//}
	//free(count);

	//由于题目已知元素个数不超过100个,因此可以用以下简化
	int count[100] = { 0 };
	for (int i = 0; i < v.size(); i++)
	{
		count[v[i]]++;
	}
	for (int i = 0; i < v.size(); i++)
	{
		if (count[i] >= v.size() / 2)
			return i;
	}

}
int more_half_count3(vector<int>& v)
{
	int tmp = v[0];
	int count = 1;
	for (int i = 1; i < v.size(); i++)
	{
		if (v[i] == tmp)
		{
			count++;
		}
		else
		{
			count--;
		}
		if (count == 0)
		{
			tmp = v[i];
			count++;
		}
	}
	return tmp;
}
 
 
 

猜你喜欢

转载自blog.csdn.net/lyl194458/article/details/89185839