男朋友说我自己婚前买了房就分手,怎么破?
刚刷到这个帖子,真的是麻了:这男朋友急啥呢?
女生工作稳定,自己有能力婚前买个三房,还愿意拿来当婚房,这放很多家庭里,父母都得笑醒吧。
结果男方上来一句,你买我就分手。听着像是要一起规划未来,细品又有点怪。
他说想两个人一起买,买大点好的,这当然没问题。可问题是,人家现在能先上车,为什么非得等你一起?房子又不是奶茶,非要两个人凑单才有仪式感。
而且婚前买房这事,本质上是安全感。你真爱她,不是应该替她高兴吗?怎么她兜里多张底牌,你先不舒服了。
面试题:N 叉树的最大深度
根节点一判空就返回 1,这题基本就写歪了。
N 叉树的最大深度,最容易错的地方不是递归,而是你到底把“空树”和“叶子节点”算成几层。空树深度是 0,只有一个根节点,深度才是 1。这个口子没收住,后面代码看着都对,提交一样挂。
题目里的节点一般长这样:
classNode{
int val;
List<Node> children;
Node(int val, List<Node> children) {
this.val = val;
this.children = children;
}
}
我一般先写递归版,短,判断也清楚。
classSolution{
publicintmaxDepth(Node root){
if (root == null) {
return0;
}
int deepestChild = 0;
if (root.children != null) {
for (Node child : root.children) {
int childDepth = maxDepth(child);
if (childDepth > deepestChild) {
deepestChild = childDepth;
}
}
}
return deepestChild + 1;
}
}
这段代码就盯住一件事:当前节点下面,哪个孩子最深。
比如某个节点下面有 3 个子节点,它们各自的深度是 2、4、1,那当前节点的深度就是 4 + 1。不是把所有孩子深度加起来,这个坑有人真踩过。树的深度看的是最长路径,不是节点总数。
递归的执行顺序也不用想得太玄乎。
走到叶子节点时,它没有孩子,deepestChild 还是 0,所以返回 1。上一层拿到这个 1,再加上自己这一层,就变成 2。一路往上退,最后根节点拿到的就是整棵树的最大深度。
不过这题如果放到线上代码里,我会多看一眼树的高度。递归写着舒服,但树特别深时,Java 栈不一定扛得住。面试题一般没事,业务里如果是外部传进来的树结构,我更愿意写个队列版,至少不会因为递归层数把线程打崩。
classSolutionByQueue{
publicintmaxDepth(Node root){
if (root == null) {
return0;
}
Queue<Node> queue = new ArrayDeque<>();
queue.offer(root);
int depth = 0;
while (!queue.isEmpty()) {
int levelSize = queue.size();
depth++;
for (int i = 0; i < levelSize; i++) {
Node current = queue.poll();
if (current.children == null) {
continue;
}
for (Node child : current.children) {
if (child != null) {
queue.offer(child);
}
}
}
}
return depth;
}
}
队列版其实就是一层一层扫。每扫完一层,depth 加 1。这里我特意用了 levelSize,不然边遍历边往队列里塞孩子,很容易把下一层节点也算进当前层,层数直接乱掉。
这题没什么花活。
递归版抓“子树最大深度”,队列版抓“当前扫到了第几层”。只要空树返回 0,叶子返回 1,剩下基本不会偏。