更多精选文章,搜寻公众号:MarkerHub
- 作者:方志宏
- https://zhuanlan.zhihu.com/p/…
这可能是历史上最简略的一道 java 面试题了。
题目很简略,实现代码,判断一个整数是否是奇数:
public boolean isOdd(int i)
置信相当数量的人都曾经在筹备吐槽了,只有看过《编程珠玑》的人都晓得这道题的答案和其中极为简略的情理。不过别着急骂街,不论你信不信,这道口试题我拿到的答案好多都长这样:
public boolean isOdd(int i) {if (i % 2 == 1) {System.out.println("是奇数");
} else {System.out.println("是偶数");
}
}
而后编译一下,发现错误了,挠挠头,顶多改成这样:
public boolean isOdd(int i) {if (i % 2 == 1) {return true;} else {return false;}
}
好吧,我抵赖我在筛选简历的能力可能有一些问题,不过不论你信不信,好多大厂工作了几年的程序员,都会写出如上格调的代码。
于是我持续进行疏导:
我:“这个函数的定义要求返回一个什么类型的值?”
候选人看了看题干:“布尔类型。”
我:“那么,你 if 前面的括号外面的表达式的值是一个什么类型的?”
疏导到这一步的时候,仍然有高达两成的候选人抉择了放弃,示意他们不晓得。好吧,我真的不晓得你们来面试这个职位的信念何在。不过大部分人想了想,还会答复出正确答案:
候选人:“也是布尔类型。”
我:“而后呢?”
有大量候选人尽管没说进去,然而我能看进去他们感觉这只是一个偶合,并不知道怎么进行下一步。不过,大多数人想了想之后,还是会优化成如下代码:
public boolean isOdd(int i) {return i % 2 == 1;}
终于过了第一关了,进行第二关的疏导:
我:“那我传进来一个 – 1 呢?”
将近一半的人在想了想之后会嘴软地示意他们从小被教诲只有自然数才有奇数偶数之分,正数没有奇偶这一说。残余的人承受了这个设定,想了一会儿,改成这样:
public boolean isOdd(int i) {return i % 2 == 1 || i % 2 == -1;}
并且在提醒之后优化成这样:
public boolean isOdd(int i) {return i % 2 != 0;}
好吧,这是迄今为止第一个能通过编译且齐全满足了需要的代码实现了。说实话,一开始就写成这样的人,如果没有其余什么显著的毛病的话,我这里根本就能通过了。我抵赖我的要求比拟低,然而来面试的人能间接写出这样的真的不太多,粗略地预计的话,大略占一到两成吧。
然而这里还没完呢,还有最重要的第三关呢:
我:“有更好的方法吗?”
候选人:“?”
我:“我感觉取模操作比较慢,有更快的解决方案吗?”
除了多数人能本人想想就想进去了之外,绝大部分(毫不夸大)候选人示意没有或者不晓得,于是进行下一步提醒:
我:“奇数和偶数转换成二进制有什么区别?”
相当一部分候选人示意本人不懂什么叫二进制和位运算,有的还示意 java 不是 c 语言,不必钻研这些,就跟很多评论会吐槽我在装逼一样。少部分候选人想了想,会怯怯地答复。
候选人:“奇数最初一位是 1,偶数最初一位是 0。”
我:“而后呢?”
这里很奇怪的点是,大部分能聊到这里来的候选人会想起来移位操作,我真的不晓得是为什么,尽管这道题的确能够有这种操作:
public boolean isOdd(int i) {return i >> 1 << 1 != i;}
然而这基本不是重点好吧!!!
总之,无论如何,能在第三关的各种疏导之后,能写出上面这个后果来的人,真的不多。能一开始没有任何疏导的就写进去的人,至今只见过两个,一个我去哪儿都带着,一个拒了我的 offer。
public boolean isOdd(int i) {return (i & 1) == 1;
}
别以为这就完了!终极 boss 来了:
我:“这样是不是比下面取模运算要快?”
候选人:“那当然了,位运算必定快啊。”
我:“然而咱们理论代码测试过,发现下面的按位与操作和取模操作,理论运行的工夫是差不多的,为什么呢?”
候选人心里 mmp:“闹了半天你这是在逗我玩啊???”
然而真正能答复出起因来的人,面试过程中我没见过,可能是大牛都看不上我所在的公司吧。只有在某公司的时候,一个共事想了想,给出了我正确答案。难道是我经验的公司都太 low 了么……