对面试题的答案不服 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
eote
V2EX    Python

对面试题的答案不服

  •  
  •   eote 2016-03-25 21:21:57 +08:00 5718 次点击
    这是一个创建于 3490 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前去了一家公司面试,被问了用 Python 实现只保留 list 里个位数为 2 的数。面试的时候太过紧张一直在想怎么用位操作,最后就写了大概是如下思路的答案
    https://gist.github.com/imAArtist/9a967e6a57003784ca1c

    面试官给了以下思路的正确答案 https://gist.github.com/imAArtist/2ae7e390db715ad87472 并表示不能用位操作实现

    今天上 厕所的时候突然想起这件事,思考了 5 分钟我想出了以下思路的答案。

    https://gist.github.com/imAArtist/3dd6c672fa815bace6ee

    所以,结论是吃太多香蕉会拉肚子

    22 条回复    2016-03-30 10:18:59 +08:00
    mhycy
        1
    mhycy  
       2016-03-25 21:26:46 +08:00
    “用 Python 实现只保留 list 里个位数为 2 的数。”
    希望你的问题没写错
    thermal
        2
    thermal  
       2016-03-25 21:33:09 +08:00   2
    难道不是 [x for x in list if x%10 == 2]
    quake0day
        3
    quake0day  
       2016-03-25 21:39:13 +08:00
    为啥在厕所想出来的答案是 C 版本的?
    LPeJuN6lLsS9
        4
    LPeJuN6lLsS9  
       2016-03-25 22:14:43 +08:00
    为什么不服?你没有实现 mod 的完整逻辑,只要数字一大你的逻辑就完蛋了……
    am241
        5
    am241  
       2016-03-25 22:25:00 +08:00
    str [-1]的开销比%10 要大吧

    另外你那一大堆 c 代码的开销应该也会比直接 % 10 要大
    真想把速度做到极致,请取字节做 bcd 转换,我记得 x86 里有指令能直接完成这个操作
    bp0
        6
    bp0  
       2016-03-25 23:01:13 +08:00   1
    嵌入式 C 里面比较少用除法和取余数,是因为很多 MCU 做除法或取余数消耗的指令周期非常多。所以才会出现很多用位操作的优化,比如 x >>= 1 ,表示 x = x/2 。

    但是你都用 python 了,还在乎这个?

    除非你的问题写错了,或者你落下了某些条件,比如数字非常大。
    billlee
        7
    billlee  
       2016-03-25 23:04:28 +08:00
    @bp0 就算是 C, 把 x / 2 变成 x>>1 也应该是编译器做的事
    bp0
        8
    bp0  
       2016-03-25 23:11:03 +08:00
    @billlee 哎,不全是的。只不过是现在很多编译器都能这么自动优化了而已。
    quake0day
        9
    quake0day  
       2016-03-25 23:17:20 +08:00
    另外 lz 在厕所里面想出来的 mod10 的代码是错的。自己找几个 testcase (32 or 42)试试就知道了。
    SoloCompany
        10
    SoloCompany  
       2016-03-26 00:16:37 +08:00
    讲道理
    你一个 python 针对 % 10 == 2 来做『优化』是脱裤子放屁的事情
    然而 10 并不是 2 的整数次幂,要不是在限定的有效位空间内能通过位移计算 mod10 那就是有鬼了,按照你的所谓思路,即使实现正确,所能覆盖的有效位空间顶多也就 8bit ,也就是可以覆盖穷举 0x00 ~ 0xff 内的有效数据,你拿个 0x100 也就是 256 代入进去计算下得出 256 % 10 = 0 就知道有多想当然了
    msg7086
        11
    msg7086  
       2016-03-26 00:18:47 +08:00   3
    这就是典型的 正常代码 / 文艺代码 / 二逼代码 的区别了。
    fish267
        12
    fish267  
       2016-03-26 00:20:19 +08:00 via Android
    @msg7086 哈哈哈哈哈
    ipconfiger
        13
    ipconfiger  
       2016-03-26 00:27:01 +08:00
    终上所述, 楼主没做出来就是没做出来, 有啥理由不服
    Lonely
        14
    Lonely  
       2016-03-26 02:55:59 +08:00 via iPhone
    emric
        15
    emric  
       2016-03-26 03:07:03 +08:00 via iPhone
    是你肠胃不好
    111111111111
        16
    111111111111  
       2016-03-26 07:32:07 +08:00 via iPhone
    求个位数为 2 ? %10?
    greatghoul
        17
    greatghoul  
       2016-03-26 09:16:32 +08:00
    硬生生把代码从一行写成了 N 行你还好意思不服!
    realpg
        18
    realpg  
    PRO
       2016-03-26 09:54:13 +08:00   1
    @msg7086
    我觉得这是正常想装文结果二逼的典型……
    Mush
        19
    Mush  
       2016-03-26 15:18:49 +08:00
    要知道, 这种代码很多时候是不 care 它跑的有多快, 考虑更多的是以后要维护呀亲. 代码是给人看的不是给机器看的, 在没有性能障碍的情况下, 写的易懂更好, 没必要绞尽脑汁写出一堆自以为很 fancy 实际上没有什么卵用的代码. 我不相信你这.c 能用到常见场景下的生产环境中去.
    hitmanx
        20
    hitmanx  
       2016-03-28 15:33:28 +08:00
    同学,这是送分题...
    xiahei
        21
    xiahei  
       2016-03-30 00:23:27 +08:00
    @hitmanx 加个‘们’,‘同学们,这是送分题啊!’
    hitmanx
        22
    hitmanx  
       2016-03-30 10:18:59 +08:00
    @xiahei 还是你这个有现场感多了!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5438 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 07:57 PVG 15:57 LAX 00:57 JFK 03:57
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86