華為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(N2),遍歷所有點對的時間復雜度為O(N2),每次處理兩個可能的正方形。
  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
繁體地址,請注明出處:http://hk.pswp.cn/web/81424.shtml
英文地址,請注明出處:http://en.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;只需返回最左邊節點的值即可。 這個…