Python技术迷

同事偷偷给我介绍私活,说1万报酬全给我,结果甲方私下告诉我说,同事在当中白拿了2万,我觉得被耍了,媳妇却让我要知足

刚看到个贴子,说同事帮他接了个私活,表面上说1万全给他,结果甲方悄悄透露实际给了3万,同事白拿2万。他气得不行,媳妇却劝他要知足,说“没有人牵线你一分钱都赚不到”。

Image

这事吧,确实挺让人堵心。被人当枪使的感觉谁都不好受,但仔细想,媳妇那话也有道理。职场里,有时候资源本身就值钱,介绍你的人拿提成、抽中介费,本质上就是信息差的变现。

网友们两派意见,一派觉得同事太黑,一派觉得楼主太天真。我倒觉得,这事别光盯着那2万,而要看自己能不能通过这次机会多认识点资源,下次能独立接单。

说到底,吃一堑长一智。能自己谈成下一个3万的单,才是真本事。【备注:文末可领最新资料】

面试题:在链表中插入最大公约数

昨天晚上十一点多,在公司楼下抽根烟,风有点大我手机差点掉下去……小李发来一句“哥,那个…链表里插最大公约数怎么写啊?”我脑子里“哐”一下,嗯这题我见过,就是两两相邻节点之间塞一个它俩的GCD,对吧,对对对,就是那个API…哦不对是 gcd。

你先想象一条链子:[a] -> [b] -> [c] -> ...,规则很土:每一对相邻 (a,b) 中间插个 [gcd(a,b)],再往后 (b,c) 也插一个。最终会变成 a -> gcd(a,b) -> b -> gcd(b,c) -> c -> ...。别被“插入”两个字吓到,链表这种结构,改指针就行,开销很小。操作时我一般是指针从头往后走,看到 cur 和 cur.next,先算个 g=gcd(cur.val, cur.next.val),随后 new 一个节点接到中间,再把指针跨两步继续走,否则会死循环,这点容易踩坑,我昨晚就差点写翻了,唉困得要死。

代码我用最普通的 Python 单链表来写,尽量口语化但别嫌弃哈:

from math import gcd

classListNode:
def__init__(self, val=0, next=None):
        self.val = val
        self.next = next

definsert_gcd(head: ListNode) -> ListNode:
# 空链表或者只有一个节点,直接返回
    cur = head
while cur and cur.next:
        g = gcd(cur.val, cur.next.val)
# 在 cur 和 cur.next 之间塞一个值为 g 的节点
        node = ListNode(g, cur.next)
        cur.next = node
# 指针跨过新插入的节点,落到原来的下一个
        cur = node.next
return head

# 一点小工具,便于自测
defbuild(nums):
    dummy = ListNode()
    p = dummy
for v in nums:
        p.next = ListNode(v)
        p = p.next
return dummy.next

defto_list(head):
    out = []
    p = head
while p:
        out.append(p.val)
        p = p.next
return out

if __name__ == "__main__":
# 例子:2->4->3
    h = build([2,4,3])
    h = insert_gcd(h)
    print(to_list(h))  # 2,2,4,1,3

你们看,这玩意儿逻辑就三句话:算、插、跳。边界也没啥玄学:空链表、只有一个节点的链表,循环直接溜走;数里有 0 也别怕,gcd(0,x)=|x|,库函数帮你兜底。要是负数?math.gcd 返回非负整数,刚好我们想要的就是“绝对”的公约数,不会出妖蛾子。

复杂度这块儿我在电梯口等车的时候算了下:每对相邻元素我们只访问一次,插一个节点,时间大体是 O(n * T_gcd);gcd 的欧几里得算法平均很快,最坏也就 O(log(max(a,b))),所以整体 O(n logV),V 是节点值的量级。空间呢?只开了常数级额外指针,但别忘了你“有意”让链表长度翻成 2n-1,这属于题意要求的结构性增长,不算额外内存开销。

还有个小细节,我刚才差点被小黑屋的自动门吓到…哦说回实现,如果你改成递归也能做,但链表长度一大(比如十万级),递归栈可能顶不住,最好像上面这样迭代。测试的时候我会顺手跑两组极端:全是质数(GCD=1,插很多 1)、全是相同数(比如全 8,插全 8),都得稳。

应用场景?别笑,真遇到过:有次做数据清洗,把相邻测点的读数“压”一下,插个公共约束做后处理标记,虽然听起来奇怪,但工程里就这么玩嘛…行了行了我去给咖啡续个命,等会儿谁要是把指针移动少了那一步,又卡在死循环里,别怪我没提醒啊。

-END-

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

🔥虎哥私藏精品🔥

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