华为OD机试 - 构成正方形的数量 - 数据结构map(Java 2023 B卷 100分)-LMLPHP

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

输入N个互不相同的二维整数坐标,求这N个坐标可以构成的正方形数量。[内积为零的的两个向量垂直]。

二、输入描述

第一行输入为N,N代表坐标数量,N为正整数。
之后的N行输入为坐标x y,以空格分隔。

x,y为整数,-10<=x,y<=10

三、输出描述

输出可以构成的正方形数量。

四、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        // 坐标数量
        int N = sc.nextInt();

        // 3个坐标构不成正方形
        if (N <= 3) {
            System.out.println(0);
            return;
        }

        // 存储坐标x y的集合
        List<int[]> list = new ArrayList<>();

        for (int i = 0; i < N; i++) {
            // 坐标x y
            int[] arr = new int[2];
            arr[0] = sc.nextInt();
            arr[1] = sc.nextInt();
            list.add(arr);
        }

        int count = 0;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < list.size() - 1; i++) {
            for (int j = i + 1; j < list.size(); j++) {
                int dist = getLength(list.get(i), list.get(j));
                map.put(dist, map.getOrDefault(dist, 0) + 1);
            }
        }

        for (int v : map.values()) {
            count += v * (v - 1) * (v - 2) * (v - 3) / 24;
        }
        System.out.println(count);
    }

    public static int getLength(int[] a, int[] b) {
        int x = a[0] - b[0];
        int y = a[1] - b[1];
        return x * x + y * y;
    }
}

五、效果展示

1、输入

4
0 0
1 2
3 1
2 -1

2、输出

1

3、说明

华为OD机试 - 构成正方形的数量 - 数据结构map(Java 2023 B卷 100分)-LMLPHP

华为OD机试 - 构成正方形的数量 - 数据结构map(Java 2023 B卷 100分)-LMLPHP


🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

华为OD机试 - 构成正方形的数量 - 数据结构map(Java 2023 B卷 100分)-LMLPHP

09-22 22:58