您的位置:首页 > 职场人生

面试题的那些事(1)

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

测试样例:
[1,2,3,2,2] 5
返回:2

解题思路:
采用阵地攻守的思想: 第一个数字作为第一个士兵,守阵地;count = 1; 遇到相同元素,count++; 遇到不相同元素,即为敌人,同归于尽,count--;当遇到count为0的情况,又以新的i值作为守阵地的士兵,继续下去,到最后还留在阵地上的士兵,有可能是主元素,也有可能是最后一个元素。再加一次循环,记录这个士兵的个数看是否大于数组一般即可。
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;//没有出现一半
}
2、有36辆自动赛车和6条跑道,没有计时器的前提下,最少用几次比赛可以筛选出最快的三辆赛车?

解题思路:
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辆车的第一名。

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次比赛则可以筛选出最快的三辆赛车。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: