程序员老鬼

一家四口,满门被裁!只有我妈还有工作!

刚刷到个贴子,说是一家四口,除了老妈,其他全被裁了。我作为程序员,真心觉得现在的就业环境有点像“古有满门抄斩,今有满门被裁”这种黑色幽默。

Image

我觉得这事吧,其实挺能反映现在打工人的无力感。网友们各种吐槽“35岁危机”“赛道消失”,但真碰上连轴被裁,才发现这哪是段子,分明是现实的辛酸。程序员在公司就像代码里的依赖,风头过了,项目砍了,分分钟全体重构,谁都不保险。

不过话说回来,网友里有的调侃老妈成“家里顶梁柱”,还有人羡慕国企的稳定。我倒觉得,靠得住的不是某份工作,而是能持续提升自我价值的能力。技术再卷、行情再差,也要让自己不容易被淘汰。【备注:文末可领最新资料】

算法题:二叉树的右视图

其实这题也就那意思,意思就是让你从右边看一棵二叉树,能看到哪些节点就都输出出来,顺序从上到下——反正一说就明白,但真写的时候有时候细节会卡。小李那时候还拿个纸画了个小树,说为啥他每次最后输出都缺节点,气得脑门青筋都出来了。

你们要说做法吧,我觉得最直接的其实就是层序遍历,breadth first search,BFS那种思路。你们想啊,右视图其实就是每一层最右边那个数,别管那层有几个,反正最后一个一定是你右边能看到的对吧。那咋搞?用个队列,每次把当前层的全都塞进去,然后遍历完这一层,最后那个元素记录下来就行。

我顺手拿手机敲了个代码,Java写的,手机屏幕小,有点眼花,你们见谅:

public List<Integer> rightSideView(TreeNode root){
    List<Integer> res = new ArrayList<>();
if (root == null) return res;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
            TreeNode node = queue.poll();
// 这一层的最后一个
if (i == size - 1) res.add(node.val);
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
        }
    }
return res;
}

就上面那玩意,写出来就真没啥难度。你每次都记录每一层最后一个节点,刚好就是右视图。小李看了直接点头说,卧槽为啥我之前总想着递归搞,结果搞得头都晕了。

说到递归,其实也不是不能写啊,就是有点绕,你每次优先往右走,然后遇到新的一层就把节点加进来。反正你要是觉得递归写着舒服,也行:

public List<Integer> rightSideView(TreeNode root){
    List<Integer> res = new ArrayList<>();
    dfs(root, 0, res);
return res;
}

privatevoiddfs(TreeNode node, int depth, List<Integer> res){
if (node == null) return;
if (depth == res.size()) res.add(node.val);
// 先右再左
    dfs(node.right, depth + 1, res);
    dfs(node.left, depth + 1, res);
}

其实你们懂我意思吧,递归的精髓就在于先往右边钻,每一层第一个碰到的节点就是右边能看到的,左边那些都藏在后面看不到。

小李其实还有个问题,就是如果树是那种很不规整的,比如有的节点只有右孩子、有的只有左孩子,其实上面两种写法都能hold住。BFS那种就一层一层来,保证最后一个是最右边,递归那种优先右孩子也能顶住。

-END-

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

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404