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 · 5134 次点击
    这是一个创建于 2925 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前去了一家公司面试,被问了用 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
    @msg7086 😄
    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  
       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   ·   我们的愿景   ·   实用小工具   ·   3556 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 04:55 · PVG 12:55 · LAX 21:55 · JFK 00:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.