算法工程师的一些面试题

这里的面试题都是自己看到的,然后感觉比较好的一些面试题目:(会陆续更新)

一、有一个数组 int array[100];本来应该存放的数为1~100,但是有两个数据丢失了,值变成了0。问如何找出丢失的那两个数?

思路:

在原数组上打表,扫两遍可以得到结果。
例子:数组大小是5,存放1-5,丢了1个数.
原数组:4 2 5 3 0
迭代:
4 2 5 3 0
3 2 5 -1 0 把3和4换一下,把4标记为-1
5 2 -1 -1 0 把3和5换一下,把3标记为-1
0 2 -1 -1 -1 把5和0换一下,把5标记为-1
跳过0
0 -1 -1 -1 -1   2已在正确位置,把2标记-1
跳过所有-1
结束
再次遍历数组,发现array[1]==0,所以数字1丢失。

时间复杂度为O(2n)


二、甲乙两地相距100公里,有一辆火车以每小时15公里的速度离开甲地直奔乙地,另一辆火车以每小时20公里的速度从乙地开往甲地。如果有一只鸟,以30公里每小时的速度和两辆火车同时启动,从甲地出发,碰到另一辆车后返回,依次在两辆火车来回飞行,直到两辆火车相遇,请问,这只小鸟往返了多少次?

选取乙车位参照物:从乙地开往甲地的火车相对静止不动
 则:
     从甲开往乙的火车速度为:v1=15+20=35km/h
     从甲飞往乙的鸟的速度为:v2=30+20=50km/h
    从甲开往乙的火车在每次小鸟达到乙的时候开的距离为x
     小鸟从乙返回和甲相遇时甲开的距离为y
     每一次相遇后甲离乙的距离为s
 易得:x=s*35/50       y=(s-x)*35/85;      s=s-x-y

程序实现如下:

#include <iostream>
#include<iomanip>
using namespace std;

int main()
{
	double s = 100;
	double x;
	double y;
	int count=0;  //计算往返次数
	while(s > 0)
	{
		x = s * 35 / 50;
		y = (35 / 85) * (s - x);
		s = s - x - y;
		count++;
	}
	cout<<count<<endl;
	system("pause");
	return 0;
}
运行结果如下:



三、一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问,最少得比多少场才能知道跑得最快的5匹马?

定义:
1.两匹马的速度快慢,称为一个关系,例如A比B快,则称A和B构成一个关系,用表示;
2.在一个关系中,每个比较对象有贡献,其中慢的向快的马贡献,马匹x具有的贡献称为度,用D(x)表示。如A比B快,则B向A贡献1,此时A的度为1,B的度为0,即D(A)=1, D(B)=2,度数说明了比较慢的马匹有多少匹;
题目分析:
求最少比赛场数应考虑每次比赛比会产生最多关系的马匹,由于不能采用撞大运的情况,考虑每次比赛后产生的关系数应为最少
解题过程:
前五场采分组比赛,得出以下关系
A组:A1 > A2 > A3 > A4 > A5
B组:B1 > B2 > B3 > B4 > B5
C组:C1 > C2 > C3 > C4 > C5
D组:D1 > D2 > D3 > D4 > D5
E组:E1 > E2 > E3 > E4 > E5
此时,每组地位平等,且每组第一名(A1,B1,C1,D1,E1)含有最多度数4,故第六场应比较每组第一名,假设得出关系如下:
A1 > B1 > C1 > D1 > E1
得出全局第一名A1
往后关系和度数如下(冒号后面的是度数)(排除掉不可能进入前五名的):
A2:3 > A3:2 > A4:1 > A5:0
B1:9 > B2:2 > B3:1 > B4:0
C1:5 > C2:1 > C3:0
D1:2 > D2:0
E1:0
由上表,第七场应比较(B1,C1,A2,A3,X)(其中X为度数为2的马匹,这里为D1或者B2)。
如果X=D1,考虑极端情况,增加最少的度数为以下情况(其他情况等价考虑):
B1 > C1 > A2 > A3 > D1
此时增加的总度数为11(其中A2分别向B1、C1贡献4度,D1分别向A2、A3贡献3度,共4×2+3×2=14度),并选出第二、三名:B1和C1;
如果X=B2,考虑极端情况,增加最少的度数为以下情况(其他情况等价考虑):
B1 > C1 > A2 > A3 > B2
此时增加的总度数为15(其中A2分别向B1、C1贡献4度,B2分别向A2、A3、C1贡献3度,共4×2+3×3=17度),并选出第二、三名:B1和C1;
由上述可知应比较(B1,B2,C1,A2,A3)。
往后关系如下(极端情况考虑并排除掉不可能进入前五名的):
A2:3 > A3:2 > B2:1 > B3:0
C2:1 > C3:0
D1:2 > D2:0
E1:0
由上表,第八场应比较(A2,A3,D1,B2,C2)。
注意A2 > A3 > B2,考虑极端情况,增加最少的度数为以下情况:
D1 > C2 > A2 > A3 > B2
此时增加的总度数为10 (其中A2分别向D1、C2贡献4度,C2向D1贡献2度,共4×2+2=10度),并选出第四名:D1;
最后第九场比赛(C2,D2,E1)可决出第五名。
综上所述,至少要赛九场方能保证决出前五名。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值