笔试面试题目:点P是否在三角形ABC内?

本文介绍了一道阿里巴巴的面试题目,即如何判断点P是否在三角形ABC内。通过使用面积法,通过判断点P与三角形各边构成的小三角形面积及总和来解决。编程实现中应用了海伦公式计算三角形面积,并考虑了浮点数比较的误差。此外,还提到了行列式公式作为另一种求面积的方法。该题目旨在考察思维灵活性,适合面试准备或兴趣挑战。
摘要由CSDN通过智能技术生成

一. 前面的话

在面试刷题这个栏目中,我主要引入一些典型有趣的题目,跟大家一起分享下思路和解法。

有的朋友,不需要面试,那也无妨,看看相关的题目,挺有趣的,也可以保持头脑的灵活。

有的朋友,需要面试,那正好,锻炼了思维的同时,顺便刷下题,相当于是一个小检验吧。

二. 面试题目

今天,我们来看一个很有趣的问题,也是一道阿里巴巴的面试题目:

如何判断点P是否在三角形ABC?

图片

小学生就能看懂这个题目,那么,该怎么去判断呢?我们第一感觉可能是:

  • 判断BP处于BA和BC之间

  • 判断AP处于AB和AC之间

  • 判断CP处于CA和CB之间

但是,怎么判断在之间呢?用斜率?那斜率要是不存在呢?貌似还是不太顺畅,况且也挺麻烦。

那就调整思路吧,再思考一下,发现用面积法挺好的,思路通了,一切好说,判断条件如下:

  • S(PAB) > 0

  • S(PBC) > 0

  • S(PAC) > 0

  • S(ABC) = 

    S(PAB) + S(PBC) + S(PAC)

三角形的面积怎么求?直接海伦公式搞起。有的朋友,可能对海伦公式不了解,这就尴尬了。话不多说,来证明一下:

图片

三. 编程实现

计算三角形的面积,用海伦公式。在判断相等关系时,需要考虑浮点数的偏差,程序如下:

#include<iostream>#include<cmath>using namespace std;
typedef struct point{  float x;  float y;}Point;
float side(Point A, Point B){  float xLen = A.x - B.x;  float yLen = A.y - B.y;  return sqrt(xLen * xLen + yLen * yLen);}
float area(Point A, Point B, Point C){  float a = side(B, C);  float b = side(A, C);  float c = side(A, B);  float p = (a + b + c)/ 2;
  //海伦公式  float s = sqrt(p * (p - a) * (p - b) * ( p - c));  return s;}
bool isEqual(float x, float y){  if(fabs(x - y) < 0.0001)    return true;
  return false;}
int main(){  Point A, B, C, P;
  A.x = 0;  A.y = 0;  // A(0, 0)  B.x = 2;  B.y = 0;  // B(2, 0)  C.x = 1;  C.y = 1;  // C(1, 1)
  P.x = 0.5;  P.y = 0.6; // P(0.5, 0.6)
  float s  = area(A, B, C);  float s1 = area(P, B, C);  float s2 = area(P, A, C);  float s3 = area(P, A, B);
  if(isEqual(s1 + s2 + s3, s) && !isEqual(s1, 0) && !isEqual(s2, 0) && !isEqual(s3, 0))    cout << "Point P lies in the triangle ABC" << endl;  else    cout << "Point P does not lie in the triangle ABC" << endl;
  return 0;}

经验证,程序OK.

四. 发散思考

已知三角形的三点坐标,求面积,一定要用海伦公式吗?非也,三角形面积的行列式公式,可别忘了,如下:

图片

注意:内层黑色竖线是行列式,外层红色竖线是绝对值。

五. 最后的话

阿里巴巴的这道面试题,主要考思维的灵活性。如果完全没有准备,在现场想出解法,也是不难的。

希望大家在刷题时,能有进步,同时获得乐趣。祝找工作的朋友们,offer多多,薪资翻倍,啦啦啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值