面试题 16.03. 交点(Hard)
2021/7/24 6:10:58
本文主要是介绍面试题 16.03. 交点(Hard),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- 完整题解
class Solution: def intersection(self, start1: List[int], end1: List[int], start2: List[int], end2: List[int]) -> List[float]: # 判断 (xk, yk) 是否在「线段」(x1, y1)~(x2, y2) 上 # 这里的前提是 (xk, yk) 一定在「直线」(x1, y1)~(x2, y2) 上 def inside(x1, y1, x2, y2, xk, yk): # 若与 x 轴平行,只需要判断 x 的部分 # 若与 y 轴平行,只需要判断 y 的部分 # 若为普通线段,则都要判断 return (x1 == x2 or min(x1, x2) <= xk <= max(x1, x2)) and (y1 == y2 or min(y1, y2) <= yk <= max(y1, y2)) def update(ans, xk, yk): # 将一个交点与当前 ans 中的结果进行比较 # 若更优则替换 return [xk, yk] if not ans or [xk, yk] < ans else ans x1, y1 = start1 x2, y2 = end1 x3, y3 = start2 x4, y4 = end2 ans = list() # 判断 (x1, y1)~(x2, y2) 和 (x3, y3)~(x4, y3) 是否平行 if (y4 - y3) * (x2 - x1) == (y2 - y1) * (x4 - x3): # 若平行,则判断 (x3, y3) 是否在「直线」(x1, y1)~(x2, y2) 上 if (y2 - y1) * (x3 - x1) == (y3 - y1) * (x2 - x1): # 判断 (x3, y3) 是否在「线段」(x1, y1)~(x2, y2) 上 if inside(x1, y1, x2, y2, x3, y3): ans = update(ans, x3, y3) # 判断 (x4, y4) 是否在「线段」(x1, y1)~(x2, y2) 上 if inside(x1, y1, x2, y2, x4, y4): ans = update(ans, x4, y4) # 判断 (x1, y1) 是否在「线段」(x3, y3)~(x4, y4) 上 if inside(x3, y3, x4, y4, x1, y1): ans = update(ans, x1, y1) # 判断 (x2, y2) 是否在「线段」(x3, y3)~(x4, y4) 上 if inside(x3, y3, x4, y4, x2, y2): ans = update(ans, x2, y2) # 在平行时,其余的所有情况都不会有交点 else: # 联立方程得到 t1 和 t2 的值 t1 = (x3 * (y4 - y3) + y1 * (x4 - x3) - y3 * (x4 - x3) - x1 * (y4 - y3)) / ((x2 - x1) * (y4 - y3) - (x4 - x3) * (y2 - y1)) t2 = (x1 * (y2 - y1) + y3 * (x2 - x1) - y1 * (x2 - x1) - x3 * (y2 - y1)) / ((x4 - x3) * (y2 - y1) - (x2 - x1) * (y4 - y3)) # 判断 t1 和 t2 是否均在 [0, 1] 之间 if 0.0 <= t1 <= 1.0 and 0.0 <= t2 <= 1.0: ans = [x1 + t1 * (x2 - x1), y1 + t1 * (y2 - y1)] return ans
这篇关于面试题 16.03. 交点(Hard)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南