某创业公司笔试题1
一、基础代码
1、已知一个三角形三个顶点坐标,求三角形面积
解:这道题没啥特殊的方法,用的是海伦公式,三角形面积S,三条边长分别为a,b,c
设 p = (a+b+c)/2,则三角形面积可以表示为:
\[S = \sqrt {p(p - a)(p - b)(p - c)} \]
2、已知两个矩形的左上和右下两点,如何判断两个矩形是否重叠
解:这道题难度不算太大,考虑到重叠的情况比较复杂,不太好判断,不妨反过来考虑,思考不重叠的情况,所有的情况如下(盗图)
我们不妨先考虑两条红色实线外的部分(不含红线穿过的矩形),设中间的大矩形为矩形1,外面的小矩形为矩形2,这些矩形的特点都是——矩形1的右下纵坐标大于矩形2的左上纵坐标或者矩形1的左上纵坐标小于矩形2的右下纵坐标;
我们再看两条红色实线之间的部分(包括红色实线穿过的矩形),这类矩形的特点是矩形1的右下横坐标小于矩形2左上横坐标或者矩形1左上横坐标大于矩形2右下横坐标
除了以上2中情况,其余都是相交,所以我们可以写出如下的代码:
1 #include <iostream> 2 using namespace std; 3 struct Rect 4 { 5 int x1, y1, x2, y2;//(x1,y1)左上 (x2, y2)右下 6 Rect(int x11, int y11, int x22, int y22) 7 { 8 x1 = x11; 9 y1 = y11; 10 x2 = x22; 11 y2 = y22; 12 } 13 }; 14 bool isOverlap(const Rect& r1, const Rect& r2) 15 { 16 //有共同的边或者共同的顶点认为非重叠 17 if (r1.y1 < r2.y2 || r1.y2 > r2.y1) 18 return false; 19 else if (r1.x1 > r2.x2 || r1.x2 < r2.x1) 20 return false; 21 else 22 return true; 23 } 24 int main() { 25 Rect r1(0, 2, 2, 0), r2(1, 3, 3, 1); 26 cout << isOverlap(r1, r2) << endl; 27 return 0; 28 29 }
二、算法编程
假设学校有若干个班级,每个班级人数不定,现在要选择某几个班级作为人数固定的表演队伍,选择班级时按照班级整体选出来,要么去哪选,要么全不选。请给出所有的方案。要求:(1)方案内班级人数按照升序排列;(2)方案不含重复
解:这道题根据面试官提示,应该先对数组排序然后做一个深度优先搜索
三、三人三鬼过河,船能装2个人
解:只要求写出步骤,不要求编程实,(【左岸】 【右岸】,渡河为从右岸开始往左岸走,目的是人鬼都要到达右岸并且任何时候都不能使得人的数量比鬼少)
初始状态(【】【3人3鬼】)
- 1人1鬼过河,人划船回来(【1鬼】)【3人2鬼】)
- 2鬼过河,1鬼划船回来(【2鬼】【1鬼3人】)
- 2人过河,1人1鬼划船回来(【1人1鬼】【2人2鬼】)
- 2人过河,1鬼划船回来(【3人】【3鬼】)
- 2鬼过河,1鬼划船回来(【3人1鬼】【2鬼】)
- 2鬼过河,完成!