ARTS Week 37
Algorithm 本周的算法题为 1232. 缀点成线 给定一个数组 coordinates ,其中 coordinates[i] = [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。 示例 1: 输入:coordinates = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]] 输出:true 实现代码如下: const checkStraightLine = function (coordinates) { // 两点确定一条直线 if (coordinates.length < 2) { return false; } // 同一个X轴 const allEqualX = coordinates.every((item) => item[0] === coordinates[0][0]); if (allEqualX) { return true; } // 同一个Y轴 const allEqualY = coordinates.every((item) => item[1] === coordinates[0][1]); if (allEqualY) { return true; } // 对角线 const [x0, y0] = coordinates[0]; const [x1, y1] = coordinates[1]; // 斜率 const slope = (y1 - y0) / (x1 - x0); // 遍历剩余的坐标点,检查斜率是否一致 for (let i = 2; i < coordinates.length; i++) { const [xi, yi] = coordinates[i]; // 避免除以零,并且使用交叉乘积来比较斜率 if ((yi - y0) * (x1 - x0) !== (y1 - y0) * (xi - x0)) { return false; } } return true; }; 解题思路: 首先,我们明确需求,即判断一组点是否都在同一直线上。这包括三种情况:所有点的X轴坐标相同、所有点的Y轴坐标相同,或者是这些点构成一条斜线。我们可以使用every方法遍历数组中的点,对比它们的X轴或Y轴坐标是否相同。 接下来,对于斜线的判断,我们需要验证这些点的斜率是否一致。如果直接计算斜率 (yi - y0) / (xi - x0) 并与另一个斜率 (y2 - y1) / (x2 - x1) 进行比较,而 x2 - x1 为0时,会遇到除零错误或浮点数精度问题。为了避免这些问题,我们可以使用交叉乘积的方法,即两边同时乘以 (xi - x0) * (x2 - x1),从而得到 (yi - y0) * (x1 - x0) == (y1 - y0) * (xi - x0) 作为斜率是否相等的判断条件。 ...