看腻了认知鸡汤,你一无所获,味同嚼蜡?看累了万字长文,你收藏了事,心事重重?

那么,我们一起,上点算法小菜,斟点程序小酒,品味一下短小的趣味算法和程序,别有一番风味。

面试题目

在本文中,我们要讨论的问题,小学生都可以看懂,却出现在程序员的面试中,是我当时应聘一家游戏公司时遇到的问题,具体题目如下:

如何判断三点共线?

多么简单直白的题目,可要答好也并不容易。在面试时,我们要扬长避短,在自己熟悉的问题上,可以主动引导深入交流。

遇到多种方法时,可采取循序渐进、逐步优化的方式进行介绍,这样也能给面试官留下很好的印象:条理清晰、思路开阔、轻重合理、善于优化。

这么简单的题目,我们该如何着手呢?本文不是为了把答案给大家,而是跟大家一起,来探讨处理问题的自然思路。

初中解法

最容易想到的,肯定是初中解法,即采用斜率的方式进行判断,比如:

K(AB) = K(AC)

即AB的斜率等于AC的斜率。知道了A、B、C的坐标,求斜率很简单吧。然而,这个方法有个漏洞,因为当AB垂直于X轴时,斜率不存在(无穷大),所以,需要处理这种边界情况。

高中解法

如果你连斜率都忘记了,那我挺无语的。但是,也别着急,用面积法也可以,如果三角形ABC的面积为0,则三点共线,即

S(ABC) = 0

那么,已知三点坐标,如何计算三角形面试呢?显然,海伦公式就可以搞定。只要高中不是特别贪玩,肯定用余弦定理证明过海伦公式,我来推导一下:

大学解法

如果你既忘记了斜率,又忘记了海伦公式,那我觉得是不太应该的。估计三角形面积的行列式公式,也应该也忘记了吧,如下:

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

小学解法

如果你忘记了上面的所有方法,那怎么办呢。别多说了,这是在面试,还是要解决问题,那就现场来解决吧。

我们在小学就知道,两点之间,直线段最短,所以,如果满足如下条件之一,那也可以表明三点共线:

AB + BC = AC

AB + AC = BC

AC + BC = AB

这个是小学生就知道的方法,虽说是小学生解法,但求距离,还是要用初中知识的,说白了,就是勾股定理。

具体编程

搞清了算法之后,具体编程就很简单了,我们以最后的一种方法为例,来写个简单程序吧:

  • #include <iostream>#include <cmath>using namespace std; struct Point{ float x; float y;}; float square(float x) { return x * x;} float getSide(const Point &p1, const Point &p2){ return sqrt( square(p1.x - p2.x) + square(p1.y - p2.y) );} bool isEqual(float x, float y){ float z = x - y; if (z > -0.000001 && z < 0.000001) { return true; } return false;} bool isSameLine(const Point &A, const Point &B, const Point &C){ float AB = getSide(A, B); float BC = getSide(B, C); float AC = getSide(A, C); if (isEqual(AB + AC, BC) || isEqual(AB + BC, AC) || isEqual(AC + BC, AB)) { return true; } return false;} int main(){ cout << isSameLine(Point{3, 3}, Point{4, 4}, Point{10, 10}) << endl; cout << isSameLine(Point{3, 3}, Point{4, 4}, Point{10, 10.2}) << endl; return 0;}

经自测OK. 平时写惯了golang, 再回来写C++, 感觉总是容易漏掉分号,哎,也正常。

最后,希望大家在刷题中,有所进步,找到乐趣。祝找工作的朋友,拿到更好offer.

笔试面试题目:三点共线的判断相关推荐

  1. 46家中外知名企业笔试面试题目

    http://blog.sina.com.cn/s/blog_4897add3010009wj.html 微软 智力题 1.烧一根不均匀的绳子,从头烧到尾总共需要1个小时,问如何用烧绳子的方法来确 定 ...

  2. 面试官吐槽:“软件测试员就是不行!”网友:我能把你面哭了!——软件测试笔试面试题目完全汇总

    软件测试笔试面试题目完全汇总 软件缺陷: 1)软件未实现产品说明书要求的功能 2)软件出现了产品说明书指明不应该出现的错误 3)软件实现了产品说明书未提到的功能 4)软件未实现产品说明书虽未明确提及但 ...

  3. 12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

    0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比 ...

  4. 2021秋招嵌入式笔试面试题目汇总

    ​本系列按类别对题目进行分类整理,这样有利于大家对嵌入式的笔试面试考察框架有一个完整的理解. 欢迎关注公众号<嵌入式Linux系统开发>,定期分享硬件.单片机.嵌入式Linux技术文章,支 ...

  5. 嵌入式笔试面试题目系列(汇总)

    嵌入式笔试 一.进程与线程 1.什么是进程.线程,有什么区别? 2.多进程.多线程的优缺点 3.什么时候用进程,什么时候用线程 4.多进程.多线程同步(通讯)的方法 5.进程线程的状态转换图 6.父进 ...

  6. 【数字设计】芯动科技|芯原科技_2023届_笔试面试题目分享

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  7. 【数字设计】经纬恒润_2023届_笔试面试题目分享

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  8. 数字IC笔试面试题目总结1_同步异步、竞争冒险

    数字IC笔试面试题目总结1 同步和异步 竞争.冒险与亚稳态 格雷码与Latch 大部分内容均来自网络公开资料,如有侵权,请联系删除! 同步和异步 同步电路和异步电路最主要的区别是什么 异步电路主要是组 ...

  9. 笔试面试题目:正方形的判断

    一. 缘来缘起 拳不离手,曲不离口.周末了,来活跃一下思路,保持对代码的敏感.我们来看一道有趣的腾讯笔试题目: 在平面内,随意给定4个点,如何判断他们能否组成一个正方形(为简便起见,假设这些点的坐标都 ...

最新文章

  1. SuperEdge — Overview
  2. php猜数游戏63,PHP实现猜数游戏的代码实例分享
  3. 电脑文件系统的管理总结
  4. 学习笔记(55):Python实战编程-Scrollbar
  5. Javascript和android原生互调
  6. JavaScript学习随记——面向对象编程(继承)
  7. win8.1 安装.NET Framework3.5
  8. Kubernetes(k8s)底层网络原理刨析
  9. 简单的MySql游标创建
  10. QtCreator格式化代码---Beautifier插件使用方式
  11. C# 通过PostMessage完成UI的更新
  12. Linux 命令 | 常用命令 tree
  13. 华硕重装后进入bios_华硕电脑重装系统后开机直接进入BIOS原因分析及解决方法...
  14. 2022 3.17网易互娱研发岗笔试题锯齿数独题解
  15. spring oauth2 的error_description本地提示中文,线上提示英文。
  16. Excel导入,一般会遇到的一些问题
  17. Blender 2.9
  18. LLM__llama-7B模型试验
  19. 【笔记】GEE之python学习
  20. 看完 GitHub 上这几个奇葩项目后,我忍不住笑了 233333

热门文章

  1. 李永乐(七)向量组的秩、矩阵的秩——笔记
  2. 如何把极坐标化为直角坐标_如何把极坐标化为直角坐标
  3. C语言中entry用法,Tkinter模块(3)-Entry
  4. Java要学到什么程度?
  5. 小白投资理财必看:图解基金买入与卖出规则
  6. NOIP学习之函数与过程抽象:91.质数的和与积
  7. superslide遇到jQuery(…).slide is not a function解决办法
  8. HTTP协议是什么?
  9. java面试一般提问的问题,详细说明
  10. php+fastcgi+apache2+php-fpm配置