V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
phpfpm
V2EX  ›  程序员

面试笔试做不出长整数加法的是不是 coding 能力就基本当没有了?

  •  
  •   phpfpm · 2020-08-20 11:02:09 +08:00 · 22741 次点击
    这是一个创建于 1567 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近面试,按说候选人背景也都不错吧。

    我们对算法要求没那么高,业务代码为主。

    因此对于各种语言的候选人,我基本都会问一道长整数加法的问题。

    俩数相加,都没有符号 /没有小数点 /字符串表示 返回和 /用字符串表示

    这题难吗?

    考察的知识点点挺广的:

    字符串 /数组操作,循环控制,流程逻辑,边界条件等等。

    这也基本上是编程的时候经常能遇到的问题。

    但是我遇到的面试者写的千奇百怪的都有:

    • 反复强调不能转 Int/number 还要强行转之后加起来的
    • 说了不能转但是按位 map 一下乘以 10 的幂加起来的
      • 乘方还写反的 idx ** 10
    • 字符串 /数组非得 reverse 否则不会写循环的
      • reverse 拼成 reserve/压根不会写这个函数的
    • 循环次数拎不清的,把短的的长度加一下长的就不管了
      • 好一点的知道再处理梳理一下长的数字的剩余位数
    • 最后多的一个进位忘记了的(很多)
      • 当然也不排除先相加判断是不是大于 10,再加上之前的进位的
    • 啰啰嗦嗦写了一大堆的
      • 极限是一个 go 的候选人干了七十多行还漏掉一些逻辑
      • 有人写 if a 长度>b 长度 then .... 我问他 else 写啥

    等等吧

    所以如果你遇到这个题,如何优雅的写一个 a+b?

    稍后我写一个我自己花了一小点时间写的答案,八行,没有很过分的压缩代码 我的代码大概长这样:

    function add(a, b) {
        let ...
        some magic {
        	cast something
            cast other
        }
        return ...
    }
    

    正经逻辑三四行写完,晚一些我贴条的方式公布我的答案。

    如果要你写,你写啥?

    第 1 条附言  ·  2020-08-20 11:35:54 +08:00
    漏了一句:
    也不许用 BigInt/各种高精度计算库了。。。

    坚持抖机灵会被面试官打死的。
    第 2 条附言  ·  2020-08-20 11:41:34 +08:00
    补充我写的 Emca Script 的版本:

    ```
    function add(a, b) {
    let pos = 0, res = ''
    while(a.length > pos || b.length > pos) {
    let carry = res.length - pos++
    res = (~~a[a.length - pos] + ~~b[b.length - pos] + carry) + res.substring(carry)
    }
    return res
    }
    ```

    这个进位处理也是受到某个面试者启发的,最后一次进位直接拼上去不处理了。
    321 条回复    2020-08-24 11:54:05 +08:00
    1  2  3  4  
    XisucksYi
        301
    XisucksYi  
       2020-08-21 18:08:54 +08:00
    @phpfpm 问你研究算法什么目的呢?
    fuckandfuckv2ex
        302
    fuckandfuckv2ex  
       2020-08-21 18:11:03 +08:00
    看完问题就知道走向了,果然。
    XisucksYi
        303
    XisucksYi  
       2020-08-21 18:31:35 +08:00   ❤️ 3
    @phpfpm 一个事实就是, 你引以为傲的技术, 不过就是打工技术而已, 再高也只是个工人罢了, 拿固定工资.

    工人不管在什么时代都是最惨的, 不是给资本家打工, 就是给地主打工.

    本身程序员职业就是苦役, 你还这样搞面试, 我都有点怀疑你是不是工贼.
    dick20cm
        304
    dick20cm  
       2020-08-21 18:40:50 +08:00
    https://github.com/bosskwei/uint512_t,汇编 adc 加法,另外有乘除位运算,模板元编程实现无限嵌套
    RedBeanIce
        305
    RedBeanIce  
       2020-08-21 18:55:48 +08:00   ❤️ 1
    杠精刚一点,
    字符串 /数组非得 reverse 否则不会写循环的
    reverse 拼成 reserve/压根不会写这个函数的
    这个我不会拼。
    jwchen
        306
    jwchen  
       2020-08-21 19:08:00 +08:00
    @nznd 是不是被柔性数组搞糊涂了
    gratonos
        307
    gratonos  
       2020-08-21 19:35:01 +08:00
    且不说题目本身的意义,只说楼主给的答案实现方式,我觉得太过于依赖语言的“隐式”特性,且过于追求代码简短,可读性并不好。实现效率也先暂不讨论。以下是我参考楼主的答案,实现的我认为可读性更高的版本,即使不熟悉 JS 的程序员也应该能理解(注:本人不是 JS 程序员,见笑):

    ``` javascript
    function add(a, b) {
    const count = Math.max(a.length, b.length);
    let array = new Array(count);
    let carry = 0;
    for (let n = 1; n <= count; n++) {
    const left = Number(a[a.length - n] || '0');
    const right = Number(b[b.length - n] || '0');
    const sum = left + right + carry;
    array[array.length - n] = String(sum % 10);
    carry = Math.floor(sum / 10);
    }
    const res = array.join('');
    return carry > 0 ? '1' + res : res;
    }
    ```
    phpfpm
        308
    phpfpm  
    OP
       2020-08-21 19:54:57 +08:00
    @XisucksYi 目的是解决问题。哈哈哈哈 我喜欢工贼这个词。
    ppphp
        309
    ppphp  
       2020-08-21 20:04:01 +08:00
    这题也太容易了吧,根本算不上是算法题,而且这是面试不是机考,有操作空间的,但是这答案也离谱,算是菜鸡互啄吧
    yanqiyu
        310
    yanqiyu  
       2020-08-21 20:11:07 +08:00 via Android
    啊,你们都一个一个串行加法吗?这得多慢,难道不应该按照 int 大小截断分段加法吗
    phpfpm
        311
    phpfpm  
    OP
       2020-08-21 20:13:06 +08:00
    @ppphp 题离谱,做不上来就离谱

    答案确实离谱,因为我在炫技啊


    @yanqiyu 奈斯,请开始你的表演
    IssacTomatoTan
        312
    IssacTomatoTan  
       2020-08-21 21:51:24 +08:00 via Android   ❤️ 1
    写这种代码的 没人想继续维护你的代码 请好走
    isukkaw
        313
    isukkaw  
       2020-08-21 21:59:27 +08:00
    楼主倒是报一报贵司是什么在什么组的啊。
    hefish
        314
    hefish  
       2020-08-21 22:46:38 +08:00
    支持 312, 307 楼的观点。 对 LZ 的吐槽大部分认同,但对 lz 给出的答案 不敢苟同。
    phpfpm
        315
    phpfpm  
    OP
       2020-08-21 23:10:24 +08:00
    @IssacTomatoTan
    @hefish

    说了只是炫技了


    @isukkaw 哈哈哈下次面试官问你这道题请勇敢的把这道题甩到他脸上。
    XisucksYi
        316
    XisucksYi  
       2020-08-21 23:15:25 +08:00
    @phpfpm 解决什么问题? 我 Google 下就知道怎么处理了, 不知道你有什么问题要到研究算法的地步.
    tikazyq
        317
    tikazyq  
       2020-08-21 23:22:24 +08:00
    @xiangbohua 楼主这种面试官我也碰到过,以为自己懂点技术就自以为是的很,殊不知同事和合作的人反感得很,显得很自大。我个人是不太愿意跟这种人打交道的。另外或许还在工作的时候喜欢扣细节,揪着一个问题死磕。而真正干活的时候却容易给队友挖坑,然后甩锅说不是自己的问题。这种人通常还带有附加属性,例如跪舔老板,轻视下属。从楼主的面试过程来看,职位应该不算太高,可能眼界确实有待提高。
    2n80HF9IV8d05L9v
        318
    2n80HF9IV8d05L9v  
       2020-08-22 17:28:46 +08:00
    楼主没问题。鉴定完毕。 目测在小城市或者小公司吧。
    HankAviator
        319
    HankAviator  
       2020-08-22 23:11:36 +08:00 via Android
    这题我高中训练奥林匹克什么赛时老师讲过😂,不过毕竟不是如楼主能炫技的骨骼清奇的奇才,最后也没记住。
    不过也幸好不会在面试上问到这种问题。
    willww64
        320
    willww64  
       2020-08-23 20:03:58 +08:00
    @gratonos 正解,我也算写了不少前端代码,看到楼主答案也是头晕。自己用 python 实现了一遍,跟你这个差不多一样。才理解了楼主的代码,楼主用了好多 js 里的隐式转换,像 ~~ 这种操作我是知道的,但绝对不会拿来用。还有 ~~undefined = 0 这种我也算是开眼界了,这种代码实际工作中要是写了的话要被打。
    ygtq
        321
    ygtq  
       2020-08-24 11:54:05 +08:00
    1  2  3  4  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1041 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:28 · PVG 06:28 · LAX 14:28 · JFK 17:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.