一道面试题的最终答案

简介: 一道面试题的最终答案

前两天看见一个人这样说,面试的时候考试一道题,深入的问,很多人败下阵来。


但是要看是什么题目了。


编写函数,判断一个传入参数是不是奇数。


这之前什么无脑科技和短路电子提供的答案比如print 不返回true false的咱们略过不表。


我们先来看一个非常直观的答案:

def isOdd(number):
    return ( (number % 2) == 1)


这样,比如传入一个number=21,则输出True。挺简单的不是吗。相信有些人会想这家公司疯了吧,拿一道都没超过程序设计课程第二章的题目来做面试题,有什么目的?

确实有点问题在里面。


你算了个被2求余数不假,但是………………谁告诉你负数就没有奇数啊?那么,一个数%2,负数的结果是什么呢?python程序员就比较幸运了……呼呼,version 3.7运行结果是1,这个没问题。怎么样,是不是很想打开IDE或者启动一个notebook看一下?建议还是看看另一算式:number % -2 在您的惯用语言是什么结果,省的面试官问了现场想哦。


如果fu—cking缺德的语言底层,给你处理成一个………………number mod 2 = -1,不就麻烦了?为了可移植性,来吧,做一个-1版本-version for -1:


def isOdd(number):
    return ( abs(number % 2) == 1)


哇哈哈,abs函数真好用。但是文章作者显然没想过放开可怜的面试者,这样的运算时间是多少?还有更快的答案吗?拐来拐去,最后落到了位运算。最后是这么一个不直观的答案:

1. def isOdd(number):
2. return ((1 & number) == 1)


其实上面的答案因为运算符优先级(看看,优先级没背熟吃亏了吧我天)的关系,可以不要括号,1 & number ==1 是一样的,加上括号可以防止读起来有歧义啊。


因为number不管是奇数偶数,表示成二进制就是1和0组合,奇数的末尾一位是1。和1按位与,前面若干个位都成0,符号位也是0,最后一位是1。这样,奇数按位与就是1,偶数就是0。


然后发现还少点啥?异常?传入参数校验?对啊,你怎么知道传入参数不是字符串不是float。还得写校验啊:


def isOdd(number):
    if type(number) != int:
        raise TypeError("parameter is NOT an Integer.")
    return ((1 & number) == 1)


然后验算一下:

>>> isOdd(22)
False
>>> isOdd(23)
True
>>> isOdd(23.5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in isOdd
TypeError: parameter is NOT a Integer.
>>> isOdd("hello")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in isOdd
TypeError: parameter is NOT a Integer.
目录
相关文章
|
4月前
|
算法
计科一二班算法数据结构实验9答案
计科一二班算法数据结构实验9答案
28 0
循环初级一(附小练习和详细代码答案)
循环初级一(附小练习和详细代码答案)
119 0
阿里巴巴80道多线程并发面试题(1~10道答案解析)
前言 个人珍藏的80道Java多线程/并发经典面试题,因为篇幅太长,现在先给出1-10的答案解析哈,后面一起完善 1. synchronized的实现原理以及锁优化?
|
9月前
|
JavaScript 前端开发 小程序
2022前端高频面试题总结(附答案)
2022前端高频面试题总结(附答案)
229 1
|
9月前
|
前端开发 JavaScript 安全
前端面试题及答案
前端面试题及答案
|
9月前
|
XML 前端开发 JavaScript
2020 前端面试题总结大全 及 答案
2020 前端面试题总结大全 及 答案
|
9月前
|
前端开发 JavaScript 算法
前端面试题及答案整理
前端面试题及答案整理
512 0
|
9月前
|
缓存 算法 安全
2022最新Java后端面试题(带答案),重点都给画出来了!你不看?
2022最新Java后端面试题(带答案),重点都给画出来了!你不看?
213 0
循环初级二(附小练习及其代码答案)
循环初级二(附小练习及其代码答案)
75 0
|
SQL 关系型数据库 MySQL
MySQL基础练习题(含详细答案)
MySQL基础练习题(含详细答案)
728 1