题目描述:
在一个 XY 坐标系中有一些点,我们用数组 coordinates 来分别记录它们的坐标,其中 coordinates[i] = [x, y] 表示横坐标为 x、纵坐标为 y 的点。
请你来判断,这些点是否在该坐标系中属于同一条直线上,是则返回 true,否则请返回 false。
题解:
由于本人未考虑除法的复杂性,所以用最直接的方法进行解题。首先判断点集中是否用两个点练成的线是与x轴平行的线,然后进行分类。第一类为点集中有与x轴平行的两点,然后进行依次判断其他的点是否满足与点集中任意其他一点的连线与x轴平行,进行对结果的输出;第二类即为没有与x轴平行的两点,此时采用的方法为“斜率法”,如果点集均在一条线上,那么其中相邻三点之间的斜率均相同。之前导致我一直WA的点就是该题目的接口是二维int型向量,但是我计算时虽然定义的是double型的k,却没有将进行计算的值进行转化,导致了整型相除的错误结果。
代码:
class Solution {
public:
bool checkStraightLine(vector<vector<int>>& coordinates) {
int flag = 1;
int zero_flag = 0;
//找一下有没有与x轴平行的
for(int i = 0;i < coordinates.size();i++){
for(int j = i+1; j < coordinates.size();j++){
if(coordinates[j][0] - coordinates[i][0] == 0){
zero_flag = 1;
break;
}}
if(zero_flag)
break;
}
//如果有跟x轴平行的,当其他的不平行是即不在一条直线
if(zero_flag){
int tag = 1;
for(int i = 0;i < coordinates.size();i++){
for(int j = i+1;j<coordinates.size();j++){
if(coordinates[j][0] - coordinates[i][0] !=0){
flag = 0;
tag = 0;
break;
}
}
if(!tag)
break;
}
}
else {
double k = (double(coordinates[1][1]) - coordinates[0][1]) / (double(coordinates[1][0]) - coordinates[0][0]);
for(int i = 0;i<coordinates.size()-1;i++){
if(((double(coordinates[i+1][1]) - coordinates[i][1]) / (double(coordinates[i+1][0]) - coordinates[i][0])) != k){
flag = 0;
break;
}
}
}
return flag;
}
};
这些博客作为自己的成长史,记录一下自己的进步与缺点。
很有意思的事请:
在找之前提到的数据类型错误的时候,我并没有向此方面想,是在询问朋友后再进行单步调试才发现的这个错误,然后我向他说了一句这样的话:
之后他回复我:
哈哈哈我觉得很有道理。