华为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.pswp.cn/web/81424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFMPEG-AAC编码

一、流程图 二、代码解释 avcodec_find_encoder: 根据指定的AVCodecID查找注册的编码器。avcodec_alloc_context3: 为AVCodecContext分配内存。()avcodec_open2: 打开编码器。avcodec_send_frame: 将AVFrame⾮压缩数据给编码器。avcodec_receive_packet: 获取到编码后的…

RPC 协议详解、案例分析与应用场景

一、RPC 协议原理详解 RPC 协议的核心目标是让开发者像调用本地函数一样调用远程服务&#xff0c;其实现过程涉及多个关键组件与流程。 &#xff08;一&#xff09;核心组件 客户端&#xff08;Client&#xff09;&#xff1a;发起远程过程调用的一方&#xff0c;它并不关心调…

Docker基础 -- Ubuntu 22.04 AArch64 交叉编译 Docker 镜像构建指南

Ubuntu 22.04 AArch64 交叉编译 Docker 镜像构建指南 作者&#xff1a; &#xff08;填写作者&#xff09; 发布日期&#xff1a; 2025‑05‑26 1 背景与目标 在企业内网&#xff08;需要代理&#xff09;环境下&#xff0c;我们需要一套可靠、可复用的 Ubuntu 22.04 交叉编…

【ISP算法精粹】ISP算法管线的预处理算法有哪些?

1. ISP预处理算法有哪些&#xff1f; 在图像信号处理&#xff08;ISP&#xff09;流程中&#xff0c;预处理阶段主要针对图像传感器&#xff08;如CMOS/CCD&#xff09;输出的原始图像数据&#xff08;通常为拜耳格式的RAW图像&#xff09;进行初步处理&#xff0c;以校正硬件…

华为OD机试真题——字符串加密 (2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

视频存储开源方案

项目成熟度 GitHub - ceph/ceph: Ceph is a distributed object, block, and file storage platform GitHub - minio/minio: MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license. GitHub - seaweedfs/seaweedfs: SeaweedFS i…

典型城市工况数据(Drive Cycle)用于车辆仿真

典型城市工况数据&#xff08;Drive Cycle&#xff09;用于车辆仿真 在车辆仿真过程中&#xff0c;使用典型的城市工况数据&#xff08;Drive Cycle&#xff09;是评估车辆性能、能耗和排放的关键步骤。以下是一些常用的典型城市工况数据及其来源&#xff0c;这些数据可以帮助…

深度解析新能源汽车结构与工作原理

一、核心系统架构 新能源汽车主要由三大核心系统构成&#xff1a; 电力驱动系统&#xff1a;包含永磁同步电机、电机控制器&#xff08;MCU&#xff09;及减速器&#xff0c;采用三合一集成设计实现轻量化。永磁同步电机通过电磁感应原理将电能转化为机械能&#xff0c;其效率可…

跳板问题(贪心算法+细节思考)

首先直接看题&#xff1a; 这题直接贪心其实问题不大&#xff1a; 下面先展示我的一个错误代码&#xff1a; # include<iostream> # include<vector> # include<algorithm>using namespace std;int main() {int N,M;cin>>N>>M;vector<vecto…

pgsql 一些用法

要查询PostgreSQL数据库中剩余的磁盘空间&#xff0c;可以使用以下方法&#xff1a; 使用SQL查询函数&#xff1a; 可以通过pg_size_pretty函数来查看数据库的总磁盘使用情况&#xff0c;例如&#xff1a; SELECT pg_size_pretty(pg_database_size(‘your_database_name’)); …

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球 文章目录 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球前言高斯函数一维高斯多维高斯 椭球基本定义一般二次形式 3D高斯椭球3D高斯与椭球的关系各向同性(Isotropic)和…

unix的定时任务和quartz和spring schedule的cron表达式区别

一、核心区别对比表 对比项Unix CrontabQuartzSpring Scheduled表达式位数5 位6 位或 7 位6 位秒级支持❌ 不支持&#xff08;最小单位是分钟&#xff09;✅ 支持✅ 支持年字段❌ 无✅ 可选第7位❌ 不支持特殊符号支持较少&#xff08;如 *, ,, -, /&#xff09;很丰富和 Quar…

C++基础算法————递推

C++递推:初学者的进阶之旅 一、引言 在计算机编程的世界里,C++ 以其强大的功能和高效性受到众多开发者的青睐。递推作为一种重要的编程思想,在解决各种复杂问题时发挥着关键作用。对于初学者来说,理解并掌握递推不仅可以提升编程能力,还能培养逻辑思维和问题解决能力。本…

QTabWidget垂直TabBar的图标和文本水平显示

一般情况下,我们可以通过QTabWidget的setTabPosition方法来设置TabBar的位置,比如设置在左边 ui->tabWidget->setTabPosition(QTabWidget::West); 但是此时图标和文字都是垂直的,如果让它们水平显示呢? 一.效果 二.原理 在绘制TabBar时,顺时针旋转90度 三.实现 …

HCIP-AI培养计划,成为新时代AI解决方案架构高级工程师

01 华为认证是什么&#xff1f; 华为认证&#xff08;Huawei Certification&#xff09;是面向数字化时代构建的ICT人才培训与认证体系。 当前超过68万来自全球180多个国家和地区的各行业精英已经取得华为认证&#xff0c;如今全球每年超过10万名学员通过考试获得华为认证。 华…

【RabbitMQ】基于Spring Boot + RabbitMQ 完成应用通信

文章目录 需求描述创建项目订单系统(生产者)完善配置声明队列下单接口启动服务 物流系统(消费者)完善配置监听队列启动服务 格式化发送消息对象SimpleMessageConverter定义一个对象生产者代码消费者运行程序 JSON定义一个对象生产者代码定义转换器消费者代码运行程序 需求描述 …

OpenGL Chan视频学习-7 Writing a Shader inOpenGL

bilibili视频链接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站&#xff1a; docs.gl 说明&#xff1a; 1.之后就不再整理具体函数了&#xff0c;网站直接翻译会更直观也会…

Vue 3.0中复杂状态如何管理

在现代前端应用中&#xff0c;状态管理扮演着至关重要的角色。一个良好的状态管理方案能够&#xff1a; 1. 保持应用数据的一致性和可预测性&#xff1b; 2. 简化组件间的通信和数据共享&#xff1b; 3. 提高代码的可维护性和可测试性&#xff1b; 4. 优化应用性能&#xf…

AGI大模型(33):LangChain之Memory

大多数的 LLM 应用程序都会有一个会话接口,允许我们和 LLM 进行多轮的对话,并有一定的上下文记忆能力。但实际上,模型本身是不会记忆任何上下文的,只能依靠用户本身的输入去产生输出。而实现这个记忆功能,就需要额外的模块去保存我们和模型对话的上下文信息,然后在下一次…

leetcode513. 找树左下角的值:层序遍历中的深度与顺序控制之道

一、题目深度解析与核心诉求 在二叉树的众多问题中&#xff0c;寻找最深层最左节点的值是一个兼具趣味性与代表性的问题。题目要求我们在给定的二叉树中&#xff0c;找到深度最大的那一层中最左边的节点值。如果存在多个最深层&#xff0c;只需返回最左边节点的值即可。 这个…