【每日一题】面试题 16.03. 两线段求交点 (py3真香)

2020.04.12
【每日一题】面试题 16.03. 两线段求交点 (py3真香)_第1张图片
一道面向数学的编程题目。对于一些数学问题的编程算法可以有进一步的理解。

本题主要是区分4种情况:

  • 两条斜率都不存在,即与y轴平行
  • 其中一条斜率不存在
    • 直线1是垂线,直线2不是
    • 直线2是垂线,直线1不是
  • 两条都不是垂线
    • 斜率相同,且截距相同并有交点
    • 斜率不同,先算出交点,再看交点是否均在两条线段之间

基本方法:

  1. 判断线段有无交点的经典写法。max(start1[1], end1[1])>=min(start2[1], end2[1]) and max(start2[1], end2[1])>=min(start1[1], end1[1])
  2. 判断点是否位于线段上的写法:(y-start2[1])*(y-end2[1])<=0

编码时的坑:

  1. python2的除法系统有问题,最好还是用py3,今后代码都会在py3完成。
  2. 如果取值可能为0,就不要用if k1:这种方式进行判断,因为k==0时候也无法进入循环。

代码如下:

class Solution:
    def intersection(self, start1: List[int], end1: List[int], start2: List[int], end2: List[int]) -> List[float]:
        if start1[0] == end1[0]:
            k1 = None
            b1 = None
        else:
            k1 = (start1[1]-end1[1])/(start1[0]-end1[0])
            b1 = start1[1]-k1*start1[0]
        if start2[0] == end2[0]:
            k2 = None
            b2 = None
        else:
            k2 = (end2[1]-start2[1])/(end2[0]-start2[0])
            b2 = start2[1]-k2*start2[0]
       

        if k1 is None and k2 is None:
            if start1[0] == start2[0] and max(start1[1], end1[1])>=min(start2[1], end2[1]) and max(start2[1], end2[1])>=min(start1[1], end1[1]):
                return [start1[0], max(min(start1[1], end1[1]), min(start2[1], end2[1]))]

        elif k1 is None:
            y = k2*start1[0]+b2
            if (y-start1[1])*(y-end1[1])<=0:
                return [start1[0], y]

        elif k2 is None:
            y = k1*start2[0]+b1
            if (y-start2[1])*(y-end2[1])<=0:
                return [start2[0], y]           
        
        elif k1 == k2:
            if b1 == b2 and max(start1[1], end1[1])>=min(start2[1], end2[1]) and max(start2[1], end2[1])>=min(start1[1], end1[1]):
                return [max(min(start1[0], end1[0]),min(start2[0], end2[0])), max(min(start1[1], end1[1]),min(start2[1], end2[1]))]
        
        elif k1!=k2:
            x = (b1-b2)/(k2-k1)
            y = k1*x+b1
            if (x-start1[0])*(x-end1[0])<=0 and (x-start2[0])*(x-end2[0])<=0:
                return [x,y]
        
        return []

你可能感兴趣的:(每日一题)