作业帮面试题

用左上和右下两个坐标点表示矩形(不考虑旋转的情况),给定两个矩形的坐标表示,(rectangle1_left_x,rectangle1_left_y,rectangle1_right_x,rectangle1_right_y)和,(rectangle2_left_x,rectangle2_left_y,rectangle2_right_x,rectangle2_right_y),要求返回这两个矩形的重合部分的坐标表示,如果没有重合部分就直接返回(-1,-1,-1,-1)

如图所示蓝色部分为重叠矩形,需要返回重叠矩形的左上角坐标和右下角坐标。

这道题直接看上去比较简单,可以考虑枚举法,可以枚举出所有的case,

如上图所示,枚举出所有六种情况,暴力解法,但是这个解法存在一些问题,首先要进行一个左边变化,让x坐标更小的矩形作为左边的矩形,x坐标更大的矩形作为右边的矩形,才能按照上面的6中情况进行处理,不然case数目又要double。另外由于变量名比较多,比较长,进行比较的时候,代码逻辑容易出问题,很容易写错。当然,如果思路清理,逻辑强的选手,应该没问题。

这里的暴力解法我们就不在过多进行介绍。

下面介绍一种更简单更优势的解法:

直接把二维平面投影到一维线段上进行处理,从上面的图中观察到,直接对上面的图形分别在X,Y轴上做投影,两个坐标轴上的重叠部分,就是最后应该返回的答案。

 

# /usr/bin/env python
# -*- coding: utf-8 -*-
import sys

reload(sys)
sys.setdefaultencoding('utf-8')


def get_coinclude_line(x1_lelf, x1_right, x2_left, x2_right):
    if x1_lelf > x2_left:
        x1_lelf, x1_right, x2_left, x2_right = x2_left, x2_right, x1_lelf, x1_right
    if x1_lelf < x2_left < x1_right < x2_right:
        return [x2_left, x1_right]
    elif x1_lelf < x2_left < x2_right < x1_right:
        return [x2_left, x2_right]
    else:
        return [-1, -1]


def func(rectangle1_left_x, rectangle1_left_y, rectangle1_right_x, rectangle1_right_y, rectangle2_left_x,
         rectangle2_left_y, rectangle2_right_x, rectangle2_right_y):
    x_line = get_coinclude_line(rectangle1_left_x, rectangle1_right_x, rectangle2_left_x, rectangle2_right_x)
    y_line = get_coinclude_line(rectangle1_left_y, rectangle1_right_y, rectangle2_left_y, rectangle2_right_y)
    if x_line==[-1,-1]or y_line==[-1,-1]:
        return [-1,-1,-1,-1]
    else:
        return x_line+y_line

 

posted on 2018-08-20 19:27  法杰拉  阅读(764)  评论(0编辑  收藏  举报

导航