华为OD机试真题里有一道题,名字特别朴素,叫“构成正方形的数量”,但考场上能把分拿满的人真不多。题目会给你一堆平面坐标点,让你数一数其中能组成多少个正方形,关键是这些正方形不一定是横平竖直的,斜着也算。我第一次做这道题的时候,第一反应是四层循环枚举四个点,写完一提交,超时超到怀疑人生;后来改成枚举两个点配合哈希表,才把复杂度压到 O(n^2)。这篇文章就把这道题的完整解法,从数学推导到 Python、Java、C++ 三套可直接运行的代码,一步不落地说清楚,顺便把去重、浮点精度这些容易翻车的细节都给你摆出来。
这道题不仅是华为OD机试的常客,在很多大厂笔试里也能看到类似的身影。它考察的东西很综合:几何建模、哈希表判重、组合枚举、复杂度分析,还有不同语言下的细节处理。无论你是刚开始刷题准备机试,还是已经在刷题阶段想找几道有代表性的题目查漏补缺,这篇文章都值得花十分钟认真看一看。
1. 题目还原与核心考点拆解
1.1 题目长什么样
“构成正方形的数量”这道题的描述并不复杂:
输入一个整数 n,表示平面上一共有 n 个不重复的坐标点,接下来给出 n 个点的坐标 (x, y)。请统计这 n 个点能组成多少个不同的正方形。任意摆放、任意角度的正方形都算。
我可以给你两个典型样例,方便你理解题意。
样例一:
code复制4
0 0
1 0
1 1
0 1
这其实就是单位正方形的四个顶点,输出应该是 1。
样例二:
code复制4
0 0
2 0
1 1
1 -1
这又是一个正方形,不过它是斜着摆放的,四个点分别是左右顶点
