面试题的那些事(1)
2016-05-29 17:22
148 查看
1、春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。
测试样例:
[1,2,3,2,2] 5
返回:2
解题思路:
采用阵地攻守的思想: 第一个数字作为第一个士兵,守阵地;count = 1; 遇到相同元素,count++; 遇到不相同元素,即为敌人,同归于尽,count--;当遇到count为0的情况,又以新的i值作为守阵地的士兵,继续下去,到最后还留在阵地上的士兵,有可能是主元素,也有可能是最后一个元素。再加一次循环,记录这个士兵的个数看是否大于数组一般即可。
解题思路:
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次比赛则可以筛选出最快的三辆赛车。
测试样例:
[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次比赛则可以筛选出最快的三辆赛车。
相关文章推荐
- 面试题的那些事(2)—斐波那契数列
- 面试题那些事(3)—栈
- 如果你抽烟而且你是程序员
- 剑指offer面试题22(java实现)
- 静态库小纪
- 一个程序员的进化史3
- 阿里,腾讯 面试经验
- [置顶] MySQL常用指令,java,php程序员,数据库工程师必备。程序员小冰常用资料整理
- [置顶] android开发之java代码中字符串对比忽略大小写。java程序员必回,可用来比对验证码等问题
- 黑马程序员——Java基础---面向对象
- 程序员如何快速准备面试中的算法
- 高频面试题之三种方法实现两个栈实现一个队列
- 程序员应该关注的一些事儿
- 面试的65个回答技巧-适用于BAT公司
- 同程面试经历 android开发工程师
- 面试题32:从1到n整数中1出现的次数
- 面试题31:连续子数组的最大和
- 十道海量数据处理面试题与十个方法大总结
- 程序员求职面试三部曲之二:提高面试的成功率
- <<沿途的向阳花>>读书笔记