华为OD机试真题——构成正方形的数量(2025B卷:100分)Java/python/JavaScript/C++/C/GO六种最佳实现
2025 B卷 100分 题型
本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!
本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》
华为OD机试真题《构成正方形的数量》:
目录
-
- 题目名称:构成正方形的数量
-
- 题目描述
- Java
-
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
- 综合分析
- python
-
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
- 综合分析
- JavaScript
-
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
- 综合分析
- C++
-
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
- 综合分析
- C语言
-
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
- 综合分析
- GO
-
- 问题分析
- 解题思路
- 代码实现
- 代码详细解析
- 示例测试
- 综合分析
- 更多内容:
题目名称:构成正方形的数量
- 知识点:几何算法、逻辑处理
- 时间限制:1秒
- 空间限制:256MB
- 限定语言:不限
题目描述
输入 N 个互不相同的二维整数坐标,求这 N 个坐标可以构成的正方形数量。(若两个向量的内积为零,则这两个向量垂直)
输入描述
- 第一行为正整数 N,表示坐标数量(1 ≤ N ≤ 100)。
- 后续 N 行每行为坐标 x y,以空格分隔,x、y均为整数(-10 ≤ x, y ≤ 10)。
输出描述
- 输出可构成的正方形数量。
示例1
输入:
3 1 3 2 4 3 1
输出:
0
说明:3个点无法构成正方形。
示例2
输入:
4 0 0 1 2 3 1 2 -1
输出:
1
说明:4个点可构成一个正方形。
Java
问题分析
我们需要根据输入的N个二维坐标点,计算能构成的正方形数量。正方形的判定条件是四个点满足特定的几何条件:四条边长度相等,相邻边垂直。
解题思路
- 输入处理:读取所有坐标点,并存入集合以便快速查找。
- 遍历所有点对:对于每两个点,计算可能的另外两个点是否存在。
- 几何条件验证:通过向量旋转确定可能的另外两个点,并检查是否存在。
- 去重处理:将找到的正方形的四个点排序后生成唯一标识,避免重复统计。
代码实现
import java.util.*; class Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; } // 重写equals和hashCode方法,确保正确比较点 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Point point = (Point) o; return x == point.x && y == point.y; } @Override public int hashCode() { return Objects.hash(x, y); } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); List points = new ArrayList(); Set pointSet = new HashSet(); // 读取所有点并存入集合 for (int i = 0; i { if (a.x != b.x) return a.x - b.x; return a.y - b.y; }); StringBuilder key = new StringBuilder(); for (Point p : list) { key.append(p.x).append(',').append(p.y).append(';'); } squares.add(key.toString()); } }
代码详细解析
- Point类:封装点的坐标,重写equals和hashCode以便正确比较。
- 输入处理:读取所有点并存入列表和集合,集合用于快速查找点是否存在。
- 遍历点对:双重循环遍历所有可能的点对,计算两个可能的另外两个点。
- 向量旋转:通过向量旋转计算另外两个点,检查它们是否存在于集合中。
- 唯一键生成:将四个点排序后生成字符串作为唯一标识,避免重复统计。
- 输出结果:集合的大小即为不同正方形的数量。
示例测试
示例1输入:
3 1 3 2 4 3 1
输出:
0
解析:三点无法构成正方形。
示例2输入:
4 0 0 1 2 3 1 2 -1
输出:
1
解析:四个点构成一个正方形。
示例3输入:
4 0 0 0 1 1 1 1 0
输出:
1
解析:四个点构成一个正方形。
综合分析
- 时间复杂度:O(N²),遍历所有点对的时间复杂度为O(N²),每次处理两个可能的正方形。
- 空间复杂度:O(N),存储点和集合的空间。
- 优势:通过向量旋转快速确定可能的点,利用集合去重确保统计正确。
- 适用场景:适用于坐标点数量适中的情况,高效且准确。
python
问题分析
给定 N 个二维坐标点,计算这些点能构成多少个不同的正方形。正方形的判定条件是四个点满足特定几何条件:所有边长相等且相邻边垂直。需注意点互不相同且坐标范围有限。
解题思路
- 输入处理:读取所有点,存储到列表和集合中,集合用于快速查找点是否存在。
- 遍历点对:对每两个点,计算可能构成正方形的另外两个点。
- 向量旋转:通过向量旋转确定可能的另外两个点位置,检查是否存在。
- 去重处理:将四个点排序后生成唯一标识,避免重复计数。
代码实现
n = int(input()) points = [tuple(map(int, input().split())) for _ in range(n)] point_set = set(points) squares
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。