Leetcode——1232. 缀点成线

题目描述:

在一个 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;
    }
};

这些博客作为自己的成长史,记录一下自己的进步与缺点。

很有意思的事请:

在找之前提到的数据类型错误的时候,我并没有向此方面想,是在询问朋友后再进行单步调试才发现的这个错误,然后我向他说了一句这样的话:

在这里插入图片描述
之后他回复我:
在这里插入图片描述
在这里插入图片描述
哈哈哈我觉得很有道理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值