这里的面试题都是自己看到的,然后感觉比较好的一些面试题目:(会陆续更新)
一、有一个数组 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匹马?