Python技术迷

外包没眼力见,抽烟不给我发一根怎么办?

刚看到个贴子,说有网友吐槽外包没眼力见,自己抽烟都不主动发一根。底下有网友回:“那你也别给他吃零食。”哈哈,这回复挺有意思,但仔细想,还真挺现实。

Image

我觉得这事吧,说大不大,说小也挺能看出职场气氛。有时候,同事间的小礼节,其实是一种默契:你敬我一尺,我敬你一丈。不是非得计较那根烟,而是大家都想感受到被尊重。但反过来,如果凡事都要“来而不往”,那就太累了。

从我的角度看,职场不是你请我一根烟,我就该还你一包。人和人相处,不该靠烟和零食维系,而是靠做事靠谱、相处舒服。少点计较,多点体谅,日子才好过。【备注:文末可领最新资料】

面试题:构造矩形

那天晚上我在公司加班,坐在那盯着屏幕发呆。刚好有个实习生问我个算法题,说是“构造矩形”,让我用 Python 写个思路清晰又不那么死板的解法。我当时脑子一懵,矩形?这题听起来挺朴素的,其实里面的逻辑挺能考人思维的。

简单说就是,给一堆点或者给定边长,要判断能不能组成一个矩形,或者干脆直接把矩形坐标算出来。不同题型思路差别还挺大,但万变不离其宗,矩形这个东西嘛,特点就那几个:对边平行且相等,四个角都是直角。

一、先从最简单的思路开始

我那会儿直接在纸上画了四个点,发现一个规律: 如果这四个点能构成矩形,那它们的对角线长度相等。这是个特别好用的性质。 所以可以这样:

import math

defdistance(p1, p2):
return math.dist(p1, p2)

defis_rectangle(points):
if len(points) != 4:
returnFalse
    dists = []
for i in range(4):
for j in range(i+1, 4):
            dists.append(distance(points[i], points[j]))
    dists.sort()
# 前4个是边长,后2个是对角线
return dists[0] == dists[1] == dists[2] == dists[3] and dists[4] == dists[5]

输入四个点,比如:

print(is_rectangle([(0,0),(2,0),(2,1),(0,1)]))  # True

这思路其实挺笨的,但在面试中够用。你只要能说出“对角线相等、边长两两相等”这两个关键词,面试官基本就点头了。

二、如果题目换成“构造矩形”

这就稍微有点意思了,比如给定两个点(对角点),让你输出矩形的四个顶点坐标。

我那会儿就写了个小函数,挺简洁的:

defconstruct_rectangle(p1, p2):
    (x1, y1), (x2, y2) = p1, p2
return [(x1, y1), (x1, y2), (x2, y1), (x2, y2)]

比如:

print(construct_rectangle((0,0), (3,2)))
# 输出 [(0,0),(0,2),(3,0),(3,2)]

这其实就是最基础的矩形构造逻辑,也可以轻松扩展到 3D,只要把坐标系换成三维就行。

三、稍微复杂一点:判断任意四点是否能组成矩形

上面那个版本虽然好理解,但有漏洞,比如:

  • 四个点能组成菱形,也可能被误判成矩形;
  • 坐标没对齐的时候,平行性没法光靠长度判断。

这时候就得用向量。 我还记得那晚我在白板上画了个图,写了两个向量 (AB) 和 (BC),然后计算它们的点积。 点积为 0,说明这两个向量垂直。于是:

defis_rectangle_strict(p1, p2, p3, p4):
defvec(a, b):
return (b[0]-a[0], b[1]-a[1])
defdot(v1, v2):
return v1[0]*v2[0] + v1[1]*v2[1]
    A, B, C, D = p1, p2, p3, p4
    v1, v2, v3, v4 = vec(A,B), vec(B,C), vec(C,D), vec(D,A)
return dot(v1, v2)==0and dot(v2, v3)==0and dot(v3, v4)==0and dot(v4, v1)==0

虽然写得笨点,但能验证矩形的直角特性。

四、如果想更生活化一点

后来我给实习生讲的时候,用了个很接地气的比喻: “你就想象在地上摆四块砖头,想摆成个矩形,你得保证:

  1. 每块砖的边都对齐;
  2. 左右两边长度一样;
  3. 对角拉条线能对上。”

算法就那意思。 如果输入是整数坐标,就用几何法; 如果输入是浮点值,那就得考虑误差(比如 abs(dot) < 1e-6)。

五、再来个拓展:构造满足面积要求的矩形

假设题目说给定面积 S,要构造所有可能的整数边长矩形 (a, b)。

defrectangles_by_area(S):
    res = []
for a in range(1, int(S**0.5)+1):
if S % a == 0:
            res.append((a, S//a))
return res

print(rectangles_by_area(12))
# 输出 [(1,12),(2,6),(3,4)]

这其实就是个因数分解问题,算法思想虽然简单,但挺能体现你逻辑思维的。

总的来说,“构造矩形”这题看似简单,其实能从几何、代数、向量到编程建模都讲得通。 我后来在面试时也爱问这类题,因为它能看出一个人是不是能先想逻辑,再写代码。

那天讲完已经晚上十一点多,实习生还拿着我那段代码说“这也太短了吧”。 我笑着说:“短是短,但你能讲出思路,这才是算法题的灵魂。”

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领