Python技术迷

公司要裁员,领导让我挑5个人,选了几个让我不爽的关系户,结果报上去以后。。

刚刷到个程序员网友吐槽,公司裁员让他挑人,结果把几个让自己不爽的“关系户”填上去了,没想到领导直接提醒:关系户的事以后少掺和,做事要注意分寸。

Image

我觉得吧,程序员天天和bug打交道,但人际关系这玩意儿比代码复杂多了。你以为删掉几个无关紧要的分支,结果人家后台调用的接口全是你没权限的。网友们有说领导故意推锅,也有劝原po多留条后路。我的看法是,职场就是个大项目,有些模块你动不了就别硬改,否则翻车的只有自己。

再怎么不喜欢关系户,该装死就装死,专注提升自己的“技术栈”才靠谱。说到底,能让你升职加薪的还是硬实力,而不是背后的小动作。【备注:文末可领最新资料】

面试题:二叉树的中序遍历

昨天晚上跟小李去楼下超市买宵夜,等电梯的时候他突然问我,说“东哥,那个二叉树的中序遍历,你能不能用点接地气的方式给我讲讲啊?就那种我坐地铁也能想明白的!”我当时正低头在那儿琢磨怎么用python把树画出来,愣了一下,跟他说,“行行行,我给你说说,别整得那么高大上。”

说真的,这玩意儿你要非让人背定义,估计十个人有八个直接脑袋嗡嗡的。其实二叉树的中序遍历,说白了就是按 左-根-右 这种顺序,把树里所有节点一个一个捋一遍,就像你逛超市,从左边货架慢慢转到右边,最后回到中间收银台。比如你有个二叉树,大致长这样:

    1
   / \
  2   3

你要是中序遍历,就是先到2,再到1,最后到3,顺序其实就是[2, 1, 3],是不是比你想的还简单点?这要是面试现场你紧张忘了,你就想,左边先走,回来记得点一下根,再去右边。

我说到这里,结果小李手机响了,他女朋友催他回去,然后这货边走边问:“那递归怎么写?非递归咋搞?”我说这不难,我电脑都没开就直接给他口述了一个版本:

definorder_traversal(root):
    res = []
defdfs(node):
ifnot node:
return
        dfs(node.left)
        res.append(node.val)
        dfs(node.right)
    dfs(root)
return res

你看这玩意儿,其实就仨步骤,先递归搞左边,回来把当前节点记上,再递归右边。就像我吃自助,先吃左边海鲜,中间来一口主食,最后去右边拿甜点。你只要按顺序写,错不了。

然后有时候你可能遇到面试官说,不让用递归,你得用栈。其实也就是用个list当栈模拟一下递归的过程呗。那天在办公室,我还真写了一遍,长这样:

definorder_traversal(root):
    res, stack = [], []
    cur = root
while cur or stack:
while cur:
            stack.append(cur)
            cur = cur.left
        cur = stack.pop()
        res.append(cur.val)
        cur = cur.right
return res

其实逻辑就那点意思,不断往左边钻,把所有左孩子都丢栈里,走到头了就开始一个一个弹出来,弹出来记个数,然后往右转一下。很像那种打地鼠游戏,往左锤一圈,锤完了回来记录一下,再往右锤。

小李边听边点头,后来回去还给我发微信,说原来就这点事,难怪面试时候总写错,那会儿脑子一急就分不清左右。哎呀你看,实际上所有二叉树相关的题,思路都不复杂,主要就是得习惯那种“左-根-右”的顺序,递归和非递归说白了就是两种记账方式,一个一笔一划记在本子上,一个脑子里模拟着记。

还有人问过,说这个中序遍历到底啥时候用?比如你要是做表达式求值啥的,或者要把二叉搜索树转成有序数组,中序遍历准没错,因为它天然能保证顺序。对,顺序这事儿不用多想,就是递增的。

-END-

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

🔥虎哥私藏精品🔥

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