之前去了一家公司面试,被问了用 Python 实现只保留 list 里个位数为 2 的数。面试的时候太过紧张一直在想怎么用位操作,最后就写了大概是如下思路的答案
https://gist.github.com/imAArtist/9a967e6a57003784ca1c
面试官给了以下思路的正确答案 https://gist.github.com/imAArtist/2ae7e390db715ad87472 并表示不能用位操作实现
今天上 厕所的时候突然想起这件事,思考了 5 分钟我想出了以下思路的答案。
https://gist.github.com/imAArtist/3dd6c672fa815bace6ee
所以,结论是吃太多香蕉会拉肚子
1
mhycy 2016-03-25 21:26:46 +08:00
“用 Python 实现只保留 list 里个位数为 2 的数。”
希望你的问题没写错 |
2
thermal 2016-03-25 21:33:09 +08:00 2
难道不是 [x for x in list if x%10 == 2]
|
3
quake0day 2016-03-25 21:39:13 +08:00
为啥在厕所想出来的答案是 C 版本的?
|
4
LPeJuN6lLsS9 2016-03-25 22:14:43 +08:00
为什么不服?你没有实现 mod 的完整逻辑,只要数字一大你的逻辑就完蛋了……
|
5
am241 2016-03-25 22:25:00 +08:00
str [-1]的开销比%10 要大吧
另外你那一大堆 c 代码的开销应该也会比直接 % 10 要大 真想把速度做到极致,请取字节做 bcd 转换,我记得 x86 里有指令能直接完成这个操作 |
6
bp0 2016-03-25 23:01:13 +08:00 1
嵌入式 C 里面比较少用除法和取余数,是因为很多 MCU 做除法或取余数消耗的指令周期非常多。所以才会出现很多用位操作的优化,比如 x >>= 1 ,表示 x = x/2 。
但是你都用 python 了,还在乎这个? 除非你的问题写错了,或者你落下了某些条件,比如数字非常大。 |
9
quake0day 2016-03-25 23:17:20 +08:00
另外 lz 在厕所里面想出来的 mod10 的代码是错的。自己找几个 testcase (32 or 42)试试就知道了。
|
10
SoloCompany 2016-03-26 00:16:37 +08:00
讲道理
你一个 python 针对 % 10 == 2 来做『优化』是脱裤子放屁的事情 然而 10 并不是 2 的整数次幂,要不是在限定的有效位空间内能通过位移计算 mod10 那就是有鬼了,按照你的所谓思路,即使实现正确,所能覆盖的有效位空间顶多也就 8bit ,也就是可以覆盖穷举 0x00 ~ 0xff 内的有效数据,你拿个 0x100 也就是 256 代入进去计算下得出 256 % 10 = 0 就知道有多想当然了 |
11
msg7086 2016-03-26 00:18:47 +08:00 3
这就是典型的 正常代码 / 文艺代码 / 二逼代码 的区别了。
|
13
ipconfiger 2016-03-26 00:27:01 +08:00
终上所述, 楼主没做出来就是没做出来, 有啥理由不服
|
15
emric 2016-03-26 03:07:03 +08:00 via iPhone
是你肠胃不好
|
16
111111111111 2016-03-26 07:32:07 +08:00 via iPhone
求个位数为 2 ? %10?
|
17
greatghoul 2016-03-26 09:16:32 +08:00
硬生生把代码从一行写成了 N 行你还好意思不服!
|
19
Mush 2016-03-26 15:18:49 +08:00
要知道, 这种代码很多时候是不 care 它跑的有多快, 考虑更多的是以后要维护呀亲. 代码是给人看的不是给机器看的, 在没有性能障碍的情况下, 写的易懂更好, 没必要绞尽脑汁写出一堆自以为很 fancy 实际上没有什么卵用的代码. 我不相信你这.c 能用到常见场景下的生产环境中去.
|
20
hitmanx 2016-03-28 15:33:28 +08:00
同学,这是送分题...
|