最近在网上看到一个挺有意思的爆料。
前360的员工爆料,自己和HR谈薪资时,开口要了50万的年薪,结果HR最后给了55万,而且不是给期权,股票的那种,每个月还给了3000元的补贴!真的太爽了
面试的时候,我们总是琢磨着“我要多少才算合理”,然后心里给自己定个底线,“如果HR敢给我低于这个数,我就直接站起来走人!”😂
但这个前360的员工真是够牛,50万开口,结果HR给了55万,还不是期权股票这种要虚不虚的,每月还有3000的补贴,简直不要太安逸了,神仙公司呀!
网友也表示,自己当初开口要了54万,HR反而给了63万。真让人羡慕!
不知道大家是不是都遇过这种“超额兑现”的好事?不过吧,话说回来,能拿到个好薪资,多少还是得看自己在面试时的谈判技巧和勇气,永远不要低估自己!
算法题:根据二叉树创建字符串
今天我们来聊聊一个常见的算法题:根据二叉树创建字符串。
可能一开始看着就头大,觉得这是不是又是个套路题?不过,咱们程序员就是需要不断用代码去解决这些“套路”,然后从中获得成就感,不是吗?😏
好,话不多说,开始讲解。题目是这样的:
给定一个二叉树,每个节点包含一个整数值,返回该树的所有子树的字符串表示。按预定规则构建字符串:对于每个节点,如果该节点没有左右孩子,则返回该节点的值;如果该节点只有左孩子,则返回节点的值和左子树的字符串表示;如果该节点同时有左右孩子,则返回节点的值、左子树的字符串表示、右子树的字符串表示。节点的值与左右子树之间需要用“()”包起来。
这个题目其实看似简单,但细节和边界条件挺多,处理不好就容易出问题。我们一开始可以考虑一个递归的思路——毕竟这题的结构本身就像一个树,递归是天生和树结构配合得最好的工具。🌳
那么,我们怎么一步一步地来实现呢?
首先,我们需要定义递归函数,返回每个子树的字符串。我们从根节点开始,如果当前节点有左右孩子,返回节点值加上子树的字符串;如果只有左孩子,就返回节点值加上左子树的字符串;如果没有孩子,直接返回节点值。
关键代码实现
我们来写一段代码,看看如何实现:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class Solution {
public String treeToStr(TreeNode root) {
if (root == null) {
return "";
}
// 先获取当前节点的值
String result = String.valueOf(root.val);
// 如果有左子树,递归处理
if (root.left != null) {
result += "(" + treeToStr(root.left) + ")";
}
// 如果没有左子树,但有右子树,空括号也要加上
else if (root.right != null) {
result += "()";
}
// 如果有右子树,递归处理
if (root.right != null) {
result += "(" + treeToStr(root.right) + ")";
}
return result;
}
}
这个实现的思路就很清晰了:
根节点值:首先,我们把当前节点的值转成字符串,并赋给 result
。左子树:如果有左子树,就递归处理左子树的字符串,并加上括号。如果没有左子树,但有右子树,我们仍然需要加个空括号来保持格式一致。 右子树:如果右子树存在,同样递归处理,并加上括号。
解析
对于每一个节点,我们首先处理当前节点的值。对于没有左子树的节点,如果有右子树,我们加上空括号。 递归的过程中,我们一直处理左右子树,直到叶子节点——这些节点没有左右孩子,因此它们的返回值就是其自身的值。
举个例子
假设我们有一个如下的二叉树:
1
/ \
2 3
\
4
调用treeToStr(root)
时,最终返回的结果是:
"1(2()(4))(3)"
解释一下:
根节点 1
有左子树2
和右子树3
。节点 2
没有左子树,但有右子树4
,所以它返回"2()(4)"
。节点 3
是叶子节点,没有子树,直接返回"3"
。
这就是我们想要的结果。每个节点的表示都符合题目要求,左右子树按照规则包裹在括号内。
细节与优化
空节点处理:我们在处理空节点时,避免了不必要的复杂性。比如说如果某个节点没有左右子树,我们通过判断条件直接返回空字符串。 递归效率:由于每个节点只访问一次,整体的时间复杂度是O(n),其中n是树中的节点数。递归的深度最坏情况下是O(n),也就是树的高度。
小结
这个题目表面看起来不难,但如果不仔细处理边界情况(比如空子树的括号),很容易写错。而且这道题的背后隐含了对二叉树结构的理解,递归的应用也相当重要。对于面试来说,不仅要会做,还要能讲清楚为什么这样做,细节处理得当才能得高分。💯
希望大家通过这个题目能更深入地理解二叉树的递归处理方式。遇到类似的题目时,思路清晰,代码也就能写得顺手!
对编程、职场感兴趣的同学,可以链接我,微信:coder301 拉你进入“程序员交流群”。