某创业公司笔试题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鬼过河,完成!

 

posted @ 2018-11-01 16:44  皇家大鹏鹏  阅读(225)  评论(0编辑  收藏  举报