Leetcode 593 javascript解决方案

200 阅读1分钟

题意

给4个点的坐标,判断能不能形成正方形

 

解决思路

取第一个点为基点,向另外3个点划线,3根的长度不是 1 : 1 : 根号2 的优先淘汰。

对3根线排序,获取第一个点的假想对角点,算作point1,计算point1跟另外2个点的距离,不相等的也out。

获取point1根第一个点的距离,如果跟之前3根线中最长线长度不一致,也out。

剩下的都通过。

 

tricky

javascript的浮点数运算很麻烦, 还好有大牛提供的方法

function strip(num, precision = 12) {
    return +parseFloat(num.toPrecision(precision));
}

 

源码

/**
 * @param {number[]} p1
 * @param {number[]} p2
 * @param {number[]} p3
 * @param {number[]} p4
 * @return {boolean}
 */
var validSquare = function(p1, p2, p3, p4) {
    if((p1[0] === p2[0]) && (p2[0] === p3[0]) && (p3[0] === p4[0]) && (p1[1] === p2[1]) && (p2[1] === p3[1]) && (p3[1] === p4[1])){
        return false;
    }
    function strip(num, precision = 12) {
        return +parseFloat(num.toPrecision(precision));
    }
    let line1 = Math.sqrt(Math.pow((p1[0] - p2[0]), 2) + Math.pow((p1[1] - p2[1]), 2));
    let line2 = Math.sqrt(Math.pow((p1[0] - p3[0]), 2) + Math.pow((p1[1] - p3[1]), 2));
    let line3 = Math.sqrt(Math.pow((p1[0] - p4[0]), 2) + Math.pow((p1[1] - p4[1]), 2));
    let list = [{
        keyA: 1,
        keyB: 2,
        value: line1
    }, {
        keyA: 1,
        keyB: 3,
        value: line2
    }, {
        keyA: 1,
        keyB: 4,
        value: line3
    }];
    list.sort((a, b) => a.value - b.value);
    if(strip(list[0].value) !== strip(list[1].value)){
        return false;
    }
    if(strip(Math.sqrt(2) * list[1].value) !== strip(list[2].value)){
        return false;
    }
    this.p1 = p1;
    this.p2 = p2;
    this.p3 = p3;
    this.p4 = p4;
    let point1 = this['p' + list[2].keyB];
    let point2 = this['p' + list[0].keyB];
    let point3 = this['p' + list[1].keyB];
    let line4 = Math.sqrt(Math.pow((point1[0] - point2[0]), 2) + Math.pow((point1[1] - point2[1]), 2));
    let line5 = Math.sqrt(Math.pow((point1[0] - point3[0]), 2) + Math.pow((point1[1] - point3[1]), 2));
    if(strip(line4) !== strip(line5)){
        return false;
    }
    let line6 = Math.sqrt(Math.pow((point1[0] - p1[0]), 2) + Math.pow((point1[1] - p1[1]), 2));
    if(strip(line6) !== strip(list[2].value)){
        return false;
    }
    return true;
};