麻了,发现年薪60万的同事,不会用GitHub。。
看到这个帖子我笑出声了:“麻了,发现年薪60万的同事,不会用GitHub,怎么破?”
说实话,我一点也不麻,甚至觉得这事儿很正常。
毕竟会不会用 GitHub,跟你能不能拿 60 万,真的没啥必然关系。有些人就是嘴巴特别会讲、汇报特别会写、PPT 一做就能拿下全场掌声👏,老板最喜欢这种“业务熟、会包装”的人。
而且你说不定还碰上的是个“资源型”员工,人脉广、信息灵,甚至搞定客户一句话的事,公司不惯着他惯谁?
所以吧,别太较真。GitHub 用得再花,业绩做不出来,领导也只会说你“技术宅,没大局观”。
是你你会怎么做呢?【备注:文末可领最新资料】。
算法题:扁平化多级双向链表
咱先说说这道题的背景。你以为是普通的双向链表?不,主链表中的某些节点还有child指针,指向另一条双向链表,妥妥的多级结构,像极了文件夹里套文件夹。题目要求是把这玩意“扁平化”——也就是说,child链表要插入到主链表中,按顺序一个不落。
这个场景让我想起某次项目里,业务需求说:“这个配置项我们支持一下多级结构吧,比如某个城市可以包含多个区域,每个区域又可以有子区域……”结果产品笑嘻嘻地加了个“支持无限嵌套”,我直接脑袋嗡嗡的 🙃。你以为链表不能卷?错,链表也开始搞“递归式内卷”了。
咱回到题目。用递归方式实现,思路其实不算复杂:
遍历主链表; 遇到某个节点有 child,就递归处理这个child链表;把child链表插进来,然后接上原链表的 next;别忘了改指针:child链表的尾巴得指回原来的next。
直接看代码更直观点👇:
classNode:
def__init__(self, val, prev=None, next=None, child=None):
self.val = val
self.prev = prev
self.next = next
self.child = child
defflatten(head):
ifnot head:
return head
defdfs(node):
curr = node
last = None
while curr:
next_node = curr.next
if curr.child:
# 递归处理child链表
child_head = curr.child
child_tail = dfs(child_head)
# 插入child链表
curr.next = child_head
child_head.prev = curr
if next_node:
child_tail.next = next_node
next_node.prev = child_tail
curr.child = None
last = child_tail
else:
last = curr
curr = next_node
return last
dfs(head)
return head
这个版本的好处是“递归”得很优雅,结构清晰。不过要是你跟我一样,有段时间对递归天然恐惧(特别是怕爆栈),也可以换个方式用显式栈来模拟递归。
栈方式实现也很经典,逻辑差不多,唯一要注意的点是:处理完一个child链表后,原来的next得先保存并压栈,child链表插进去后,从栈里再弹出next接上。这就像那种:你打开一个抽屉,又打开里面的小抽屉,再一个个塞回去,一层不能少
讲真,这种题虽然看着眼熟,但真让你从头撸,细节巨多。指针的前后关系一旦没理清,运行结果立马就翻车,轻则链断,重则死循环。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。