当前位置: 首页 > ops >正文

华为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个二维坐标点,计算能构成的正方形数量。正方形的判定条件是四个点满足特定的几何条件:四条边长度相等,相邻边垂直。

解题思路

  1. 输入处理:读取所有坐标点,并存入集合以便快速查找。
  2. 遍历所有点对:对于每两个点,计算可能的另外两个点是否存在。
  3. 几何条件验证:通过向量旋转确定可能的另外两个点,并检查是否存在。
  4. 去重处理:将找到的正方形的四个点排序后生成唯一标识,避免重复统计。

代码实现

import java.util.*;class Point {int x, y;public Point(int x, int y) {this.x = x;this.y = y;}// 重写equals和hashCode方法,确保正确比较点@Overridepublic 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;}@Overridepublic 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<Point> points = new ArrayList<>();Set<Point> pointSet = new HashSet<>();// 读取所有点并存入集合for (int i = 0; i < n; i++) {int x = scanner.nextInt();int y = scanner.nextInt();Point p = new Point(x, y);points.add(p);pointSet.add(p);}Set<String> squares = new HashSet<>();// 遍历所有点对for (int i = 0; i < points.size(); i++) {Point p1 = points.get(i);for (int j = 0; j < points.size(); j++) {if (i == j) continue; // 跳过同一个点Point p2 = points.get(j);// 计算向量差int dx = p2.x - p1.x;int dy = p2.y - p1.y;// 情况1:计算可能的另外两个点Point p3 = new Point(p2.x - dy, p2.y + dx);Point p4 = new Point(p1.x - dy, p1.y + dx);// 检查这两个点是否存在if (pointSet.contains(p3) && pointSet.contains(p4)) {addSquare(squares, p1, p2, p3, p4);}// 情况2:另一个方向Point p5 = new Point(p2.x + dy, p2.y - dx);Point p6 = new Point(p1.x + dy, p1.y - dx);if (pointSet.contains(p5) && pointSet.contains(p6)) {addSquare(squares, p1, p2, p5, p6);}}}System.out.println(squares.size());}// 生成正方形的唯一键并存入集合private static void addSquare(Set<String> squares, Point... points) {List<Point> list = new ArrayList<>(Arrays.asList(points));// 按x和y排序,生成唯一键Collections.sort(list, (a, b) -> {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());}
}

代码详细解析

  1. Point类:封装点的坐标,重写equalshashCode以便正确比较。
  2. 输入处理:读取所有点并存入列表和集合,集合用于快速查找点是否存在。
  3. 遍历点对:双重循环遍历所有可能的点对,计算两个可能的另外两个点。
  4. 向量旋转:通过向量旋转计算另外两个点,检查它们是否存在于集合中。
  5. 唯一键生成:将四个点排序后生成字符串作为唯一标识,避免重复统计。
  6. 输出结果:集合的大小即为不同正方形的数量。

示例测试

示例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  

解析:四个点构成一个正方形。

综合分析

  1. 时间复杂度:O(N²),遍历所有点对的时间复杂度为O(N²),每次处理两个可能的正方形。
  2. 空间复杂度:O(N),存储点和集合的空间。
  3. 优势:通过向量旋转快速确定可能的点,利用集合去重确保统计正确。
  4. 适用场景:适用于坐标点数量适中的情况,高效且准确。

python

问题分析

给定 N 个二维坐标点,计算这些点能构成多少个不同的正方形。正方形的判定条件是四个点满足特定几何条件:所有边长相等且相邻边垂直。需注意点互不相同且坐标范围有限。


解题思路

  1. 输入处理:读取所有点,存储到列表和集合中,集合用于快速查找点是否存在。
  2. 遍历点对:对每两个点,计算可能构成正方形的另外两个点。
  3. 向量旋转:通过向量旋转确定可能的另外两个点位置,检查是否存在。
  4. 去重处理:将四个点排序后生成唯一标识,避免重复计数。

代码实现

n = int(input())
points = [tuple(map(int, input().split())) for _ in range(n)]
point_set = set(points)
squares 
http://www.xdnf.cn/news/9081.html

相关文章:

  • P2340 [USACO03FALL] Cow Exhibition G
  • 时序模型上——ARIMA/
  • 云蝠 Voice Agent:开启大模型时代语音交互新纪元
  • AAOS系列之(四) ---APP端如何获取CarService中的各个服务代理
  • day8补充(中断驱动和队列缓冲实现高效数据处理)
  • day020-sed和find
  • 【C++高阶一】二叉搜索树
  • Speech Synthesis/Text to Speech(TTS)
  • 写给这个阶段自我的一封信
  • Solr搜索:比传统数据库强在哪?
  • 【Ai】使用Ultralytics yolo做图片检测+使用roboflow做数据标注
  • 机器学习与深度学习5:pytorch前馈神经网络FNN实现手写数字识别
  • Halcon仿射变换---个人笔记
  • PySide6 GUI 学习笔记——常用类及控件使用方法(光标类图标QCursor)
  • 918. 环形子数组的最大和
  • 消费电子卷入“技术军备竞赛”
  • shell脚本基础
  • 记忆上传与自我同一性的哲学-技术综合分析
  • AI日报 - 2025年05月26日
  • 快速了解GO之Channel 通道
  • uv ——新的python包管理工具
  • 如何在 ONLYOFFICE 演示文稿中调整段落首行缩进
  • 第10章 网络与信息安全基础知识
  • 【分治】数组中的逆序对
  • 格恩朗管段超声波流量计:流量测量先锋
  • SD-WAN与传统网络结合:轨道交通网络优化的高效实践与深度解析
  • Day37打卡 @浙大疏锦行
  • 数据库入门:以商品订单系统为例
  • Nuxt.js vs Next.js:Vue 与 React 阵营的 SSR 双雄对比
  • python25-递归算法