5.17号下午去面了厦门美团- -。连续4轮。面了将近三个小时。。。
一共问到了三道算法题,觉得还挺有意思的所以写了这篇博客。
(代码未经测试 尽可能还原当时手写的代码)
1、反转二叉树
面试官大大:“先写个算法吧,反转二叉树”
我:“啥?没了?就五个字?左右反转吗?”
面:”嗯“
看来我的一面面试官是个不苟言笑的 程序员- -。。。
public class Solution {
public static void main(String[] args){
/*假装n是一棵树的根节点*/
Node n = new Node();
reverseTree(n);
}
private static void reverseTree(Node n) {
if(n==null){
return ;
}
swap(n.left,n.right,n);
reverseTree(n.left);
reverseTree(n.right);
}
private static void swap(Node left, Node right, Node n) {
n.left = right;
n.right = left;
}
}
class Node{
Node left;
Node right;
int value;
}
2、max(a,b)
一面面试官看完我上面手写的代码后,一言不发。
沉思数秒。
面:”那在写一个算法题吧“
面:”不能用比较符号,if,else,问好,冒号输出二者最大值“
我:(想了一会儿)”那。。switch,case呢?“
面:”不行“
我:(又想了一会儿)”强转可以用吗?“
面:“不行”
我:(又又想了一会儿)“想不出来,面试官大大”
面:“你再想想”
然后大概想出了如下思路,
a-b可以取到符号位(1 or 0)
那么 b-a 肯定是相反的符号位(0 or 1)
我们知道 &1等于本身,&0等于0
然后。。。(面试的时候 引入了很多中间变量)
public class Solution {
public static void main(String[] args){
int a=1, b =2;
max(a,b);
}
private static int max(int a, int b) {
return (a&~((b-a>>31)+1))|(b&~((a-b>>31)+1));
}
}
第三题算法是二面面试官,说他刚想出来的。。
题目是输入一个int n,
输出匹配的括号有多少排列种可能。。
有点抽象举个例子
输入3
可能有如下
((()))
(())()
()(())
- -。这个题相对比较简单,可以抽象成
n可以分成多少个数的和(不同序不同)
public class Solution {
public static void main(String[] args){
int n=10;
cucul(10);
}
private static int cucul(int n) {
if(n==0||n==1) return 1;
int tmp = 0;
for(int i=1;i<=n;i++){
tmp += cucul(n-i);
}
return tmp;
}
}
总而言之,在厦门美团的面试体验还是非常不错的- -。
面试官非常的有水平~而且非常的和蔼~特别开心~