算法题--华为od机试考试(构成的正方形数量、TLV解码、简易内存池)

目录

构成的正方形数量

题目描述

输入描述

输出描述

示例1

输入

输出

示例2

输入

输出

注意

解析

答案

TLV解码

题目描述

输入描述

输出描述

示例1

输入

输出

解析

答案

简易内存池

题目描述

 注意

 输入描述

 输出描述

 示例1

 输入

 输出

 解析

答案


构成的正方形数量

考察数学、set集合

题目描述

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

输入描述

第一行输入N,N代表坐标数量,N为正整数。N<=100

之后的K行输入为坐标x y,以空格分隔,x、y为整数,-10<=x,y<=10

输出描述

输出可以构成正方形数量

示例1

输入

3

1 3

2 4

3 1

输出

0

示例2

输入

10

0 0

0 1

1 0

1 1

2 0

0 2

2 1

1 2

2 2

输出

6

注意

(1,0),(0,1),(1,2),(2,1)也可以构成正方形。

解析

确定2点,以这2点组成正方形的一条边,此时便可以确定正方形的另外两点的位置,有2种情况,需要判断另外2点是满足要求。

答案

function getSquareCount(str) {
    let coordinates = str.split('\n')
    let n = coordinates.shift()
    if (n <= 3) {
        return 0
    }
    let squareCount = 0;
    const set = new Set(coordinates);
    for (let i = 0; i < coordinates.length; i++) {
        let [x1, y1] = coordinates[i].split(" ").map((ele) => parseInt(ele));
        for (let j = i + 1; j < coordinates.length; j++) {
            let [x2, y2] = coordinates[j].split(" ").map((ele) => parseInt(ele));
            let x3 = x1 - (y1 - y2);
            let y3 = y1 + (x1 - x2);
            let x4 = x2 - (y1 - y2);
            let y4 = y2 + (x1 - x2);
            if (set.has(x3 + " " + y3) && set.has(x4 + " " + y4)) squareCount++;
            let x5 = x1 + (y1 - y2);
            let y5 = y1 - (x1 - x2);
            let x6 = x2 + (y1 - y2);
            let y6 = y2 - (x1 - x2);
            if (set.has(x5 + " " + y5) && set.has(x6 + " " + y6)) squareCount++;
        }
    }
    return squareCount / 4;
}
console.log(getSquareCount(`3
1 3
2 4
3 1`))
console.log(getSquareCount(`9
0 0
0 1
1 0
1 1
2 0
0 2
2 1
1 2
2 2
`))<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值