面试题的那些事(1)

一、春节期间小明使用微信收到不少个红包,很是开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽量高效。给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。
算法

测试样例:数组

[1,2,3,2,2]  5微信

返回:2ide


解题思路:测试

采用阵地攻守的思想: 第一个数字做为第一个士兵,守阵地;count = 1; 遇到相同元素,count++; 遇到不相同元素,即为敌人,玉石俱焚,count--;当遇到count为0的状况,又以新的i值做为守阵地的士兵,继续下去,到最后还留在阵地上的士兵,有多是主元素,也有多是最后一个元素。再加一次循环,记录这个士兵的个数看是否大于数组通常便可。it

int MoreThanHalfNum_Solution(int* gifts, int size)
{
	if (gifts == NULL)
	{
		return 0;;
	}//参数错误

	int count = 1;//计数器记录士兵的生命值
	int soldier = gifts[0];//士兵初始化为第一个数字

	for (int i = 1; i < size; i++)
	{

		if (soldier == gifts[i])//遇到相同的元素士兵生命值增长
		{
			count++;
		}
		else//遇到不相同的元素士兵生命值减小
		{
			count--;
		}

		if (count == 0)//士兵的生命值为0时将下一个元素从新赋给士兵
		{
			soldier = gifts[++i];
			count = 1;//士兵生命值为1
		}

	}

	count = 0;
	for (int j = 0; j < size; j++)
	{
		if (soldier == gifts[j])
		{
			count++;//计数器记录该士兵出现的次数
		}
	}

	if (count > size / 2)
	{
		return soldier;//士兵出现的次数大于一半
	}

	return 0;//没有出现一半
}

二、有36辆自动×××和6条跑道,没有计时器的前提下,最少用几回比赛能够筛选出最快的三辆×××?io


解题思路:class

1)首先将36辆车分为6组进行一次比赛,这是必不可少的,假设六组的代码分别为A,B,C,D,E,F。经过6次比赛能够分别的找到每组的第一名A1,B1,C1,D1,E1,F1。循环


2)接下来就能够再进行第7场比赛,让各小组的第一名A1,B1,C1,D1,E1,F1进行比赛,淘汰掉后三名假设为D1,E1,F1,进而能够将D,E,F三组整个淘汰。而且获得6组的第一名,假设为A1,同时也为36辆车的第一名。di


3)进行最后一场比赛,由于第一名已经决出为A1,同时只剩下B1,C1,A2,B2,C2,A3,B3,C3,从其中找到第2名和第3名,经过分析能够获得,若是在已知的比赛结果中若是存在2辆车跑的比他快,则能够直接淘汰,由于就算成绩最好的结果下他也为第4名。

因为:

B1>B2>B3

C1>C2>C3

B1>C1>C2

因此B3,C3,C2能够直接淘汰,最后剩下的待肯定的×××为B1,C1,B2,A2,A3


综上所述,最少8次比赛则能够筛选出最快的三辆×××。

相关文章
相关标签/搜索