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

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

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

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

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

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

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

    这题难吗?

    考察的知识点点挺广的:

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

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

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

    • 反复强调不能转 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  
    Boyce
        101
    Boyce  
       2020-08-20 14:52:07 +08:00
    @XisucksYi 大佬就是不一样(没讽刺),我校招时同学,社招时同事就只见过一个技术面试没准备的,其他的都刷过题,背过面经。
    raysonlu
        102
    raysonlu  
       2020-08-20 15:02:15 +08:00
    能解决业务的代码才是好代码
    phpfpm
        103
    phpfpm  
    OP
       2020-08-20 15:05:03 +08:00
    在开会,集中回复下各位。
    @InkStone 是,我面试也写不出这样的代码,只是炫技而已。
    @fengmumu 我没有说一定不能 reverse,我的点在于用 reverse 表示自己对循环的控制不好,真的太多候选人只会写一种 for 了,不要断章取义。

    而且我的引导+优化的时间都有给,比如我会直接 challange 为什么需要 reverse,看下候选人是否能想到这层优化。
    我相信面试者在写这道题的时候会尽自己最大的可能性去完成,如果这个做不好平时工作做一些逻辑的东西写出来的代码一定不敢恭维。

    @TrickWu 对于纯数字的 ok 的,当然没有处理很多的边界情况。炫技而已啦。
    @followsin 哈哈哈你看我 id 。


    @jsisjs20130824 和。。背景关系不大吧。。。这个题真的不算是算法题了啊
    你们为啥都觉得这个就是算法了,就基本的字符串操作,这个太基本了吧。
    @sunziren 秀儿!
    @murmur 不是。。字节怎么了,要是真的字节的面试官问这个就可以为所欲为了么。。
    @raysonlu 我是觉得写个回文数对做业务没啥帮助,会写 kmp 也没啥帮助,但是这个考察的太基本了
    Bromine0x23
        104
    Bromine0x23  
       2020-08-20 15:06:23 +08:00
    这题也就沾一点点算法,侧重点还是在编码实现上。这个算法本身用 竖式加法/按位相加 就可以描述,但实现起来很容易写错,也很容易漏掉对各种边界条件的处理、考虑。这个是很能看出能力的
    XisucksYi
        105
    XisucksYi  
       2020-08-20 15:13:19 +08:00
    @phpfpm "如果这个做不好平时工作做一些逻辑的东西写出来的代码一定不敢恭维", 你當人家不會用 Google? 誰寫代碼直接寫? 誰不是直接 copy 過來改的?
    myself659
        106
    myself659  
       2020-08-20 15:14:35 +08:00
    用 c 基本上不用 10 分钟可以写完
    Marstin
        107
    Marstin  
       2020-08-20 15:18:06 +08:00
    function add(num2,num1){
    let numArr1 = num1.split(""),numArr2 = num2.split(""),res = [],flag = 0,sum = 0;
    while(numArr1.length > 0 || numArr2.length > 0){
    sum = Number.parseInt(numArr1.pop()||'0') + Number.parseInt(numArr2.pop()||'0') + flag;
    flag = parseInt(sum/10);
    res.push(sum%10)
    }
    return [...res,flag||""].reverse().join("");
    }
    Marstin
        108
    Marstin  
       2020-08-20 15:19:51 +08:00
    写是能写出来的,就是要一边写一遍百度,思路知道,但是 api 记不住啊,比如取最后一位,逆转,还有字符串转 int,全都要百度
    thinkdeep
        109
    thinkdeep  
       2020-08-20 15:27:22 +08:00   ❤️ 1
    只能说楼主能力不行,思维僵化,看见这种人就反感,非常反感,自以为是,还在纠结这小小问题,技术能力 99%肯定不怎么样,多面试几方面,有可能会发现不一样的地方。
    maplelin
        110
    maplelin  
       2020-08-20 15:30:47 +08:00
    @XisucksYi #96 然后呢,FAANG 哪家面试不考算法?不要因为个别面试官否认算法对人才能力水平的考验
    moooookey
        111
    moooookey  
       2020-08-20 15:32:19 +08:00
    回字有几种写法
    buffzty
        112
    buffzty  
       2020-08-20 15:38:31 +08:00
    我就是你说的那种写几十行的,我没刷过算法,就随手写 怎么快怎么来,没必要损别人. 如果人家面试的提前准备一下 刷点题 估计很多被你刷掉都能秒你啊
    ```go
    func bigIntAdd(a, b string) string {
    var res string
    var maxLen int
    aLen := len(a)
    bLen := len(b)
    if bLen > aLen {
    maxLen = bLen
    a = strings.Repeat("0", bLen-aLen) + a
    } else {
    maxLen = aLen
    b = strings.Repeat("0", aLen-bLen) + b
    }
    if maxLen == 0 {
    return "0"
    }
    sumArr := make([]byte, maxLen+1)
    sumArr[0] = '0'
    for i := maxLen; i > 0; i-- {
    sumArr[i] += a[i-1] + b[i-1] - '0'
    }
    for i := maxLen; i > 0; i-- {
    if sumArr[i] <= '9' {
    continue
    }
    sumArr[i] -= 10
    sumArr[i-1]++
    }
    res = strings.TrimLeft(string(sumArr), "0")
    return res
    }
    ```
    calpes
        113
    calpes  
       2020-08-20 15:38:32 +08:00   ❤️ 10
    讲道理,第一这题没什么实际意义,考察这种没有使用场景的 string 操作不如考察各种 substring 之间的骚操作,起码有的时候还能用到,非要让人实现一个竖式计算器有点愚蠢
    第二,我年轻的时候也喜欢把代码写的很酷炫,什么位运算啦什么元编程啦什么 magic number 啦,但是现在除了一些 functional 的写法,我都不会在涉及工程开发的项目里用了,就算用也要把原理写的明明白白的,作为一个合格的工程师,写出来的代码提供良好的可读性,可以让傻子都轻松看懂,是一种义务
    nevin47
        114
    nevin47  
       2020-08-20 15:42:44 +08:00
    LZ 没毛病
    长整数运算,就算是没准备,临场了也想不出来的,不指望后面能写出啥好代码
    phpfpm
        115
    phpfpm  
    OP
       2020-08-20 15:48:26 +08:00
    @Marstin
    @thinkdeep

    我是这么理解的。

    作为面试官要有一定的技巧高效的筛选合适的人。

    答得上来这道题的不一定合适,答不上来回答不好的不一定不合适。
    如果按照能答好作为 positive,

    false positive 占能回答上来的比例是较高的,能答上来这个问题之后再多提问仔细甄别,这部分有一定含金量;
    false negative 占比是很少的,这个都答不上来但是是真正的大神的比例少之又少,简单追问几个问题就可以确定是不合适的人了。

    这道题不是金科玉律,只是一种高效筛选候选人的方式,及时了解候选人的技术能力。

    真的把这道题当成非黑即白的判据才是真正的思维僵化呢。
    phpfpm
        116
    phpfpm  
    OP
       2020-08-20 15:49:46 +08:00
    @calpes 其实还是那句话,这题已经不难了,要是再提高难度就更剩不下几个人&错过一些人了。
    Marstin
        117
    Marstin  
       2020-08-20 15:56:10 +08:00
    @phpfpm 笔试面试,又不是开发过程,伪代码甚至流程图都 OK,最烦叫人手写代码
    TypeError
        118
    TypeError  
       2020-08-20 16:01:24 +08:00 via Android
    思路很简单,但是如果纸上 bug free 代码就麻烦得很
    Nich0la5
        119
    Nich0la5  
       2020-08-20 16:06:54 +08:00 via Android
    我一直以为手写高精度是基本功
    phpfpm
        120
    phpfpm  
    OP
       2020-08-20 16:09:38 +08:00
    @Marstin
    @TypeError

    伪代码把逻辑写对了我也没意见啊

    我提的问题也都是逻辑层面的,边界思考不全逻辑不对那就不好意思了。

    现在面试都是视频面试,允许面试者在自己熟悉的代码编辑器里面写代码
    什么代码高亮代码补全甚至函数参数提示都有,没关系,明牌打。

    之前有一个面试者写 array.reduce 的时候问我哪个参数代表原数组,他写到第二个参数的时候代码编辑器的函数签名已经提示的很明确了——虽然是英文的,连这个都不看的或者看不懂的 emmm
    ipoh
        121
    ipoh  
       2020-08-20 16:10:14 +08:00
    看了下楼主的 Emca Script 版本,问题也挺大的

    只要实现里面用了加法(有加号)都要考虑一下该次加法是不是长整数加法
    rooob1
        122
    rooob1  
       2020-08-20 16:12:34 +08:00
    @Marstin 对,还嫌弃别人把“reverse 拼成 reserve/压根不会写这个函数的”。这种人真讨厌
    phpfpm
        123
    phpfpm  
    OP
       2020-08-20 16:19:19 +08:00
    @ipoh emmm 一个 char 转成的数字的加法怎么也不会溢出吧,没有 get 到你的点。

    @rooob1 基本的英语单词。
    fengmumu
        124
    fengmumu  
       2020-08-20 16:20:43 +08:00
    @phpfpm 如果是,给出问题,等待解决,看代码,提示可以优化的地方,看反应,这个我表示支持,但是对于代码风格或者‘优雅’挑毛病的,表示面试官是傻逼
    fengmumu
        125
    fengmumu  
       2020-08-20 16:25:26 +08:00
    @XisucksYi 就题目来说我觉得还好,总比问 api 的好太多,就是感觉楼主吐槽的地方有点怪,不知道他想说的是面试人的写法不行还是逻辑思维不行,还是基础知识不行,另外就是标题取得有点招骂
    phpfpm
        126
    phpfpm  
    OP
       2020-08-20 16:25:59 +08:00
    @fengmumu 绝大多数的人到不了优雅这个程度。

    无提示 bug-free 就已经很不错了
    phpfpm
        127
    phpfpm  
    OP
       2020-08-20 16:32:38 +08:00
    @fengmumu 标题嘛那么回事啦,这个确实是我写的欠妥。

    工作若干年面试的人数也好几百了,对于面试中遇到的问题,评价以及入职之后的表现的相关程度有一定感知。

    通过面试的不一定太好,但是至少也不至于太差。

    打个比方,真的不要指望只会写 for i=1 to n 的人在实际业务中能写出漂亮的代码。
    提示不要用 reverse 的本质也是考察会不会变通的写循环代码,仅此而已。
    Reapper
        128
    Reapper  
       2020-08-20 16:33:02 +08:00
    切割,循环,加法,进位,这样的回答可否?
    ziwiwiz
        129
    ziwiwiz  
       2020-08-20 16:36:26 +08:00
    简单的思路就是两个字符串都 pop 出来相加进位,结果再反转下。
    string add(string a, string b)
    {
    string res;
    int i = 0;
    while(!a.empty() || !b.empty())
    {
    int x = i;
    if(!a.empty())
    {
    x = x + a.back() - '0';
    a.pop_back();
    }
    if(!b.empty())
    {
    x = x + b.back() - '0';
    b.pop_back();
    }
    i = x/10;
    x = x%10;
    res.push_back('0'+x);
    }
    if(i)
    res.push_back('1');
    string result;
    while(!res.empty())
    {
    result.push_back(res.back());
    res.pop_back();
    }
    return result;
    }
    yaphets666
        130
    yaphets666  
       2020-08-20 16:41:54 +08:00
    大学上的第一门课 第一页 第一个字是啥? 不记得说明基本功很差
    lenqu
        131
    lenqu  
       2020-08-20 16:44:12 +08:00
    @phpfpm
    没人 python 或者 anaconda 么?一行代码不舒服么?
    thinkdeep
        132
    thinkdeep  
       2020-08-20 16:58:52 +08:00   ❤️ 1
    @phpfpm 你这样问一个应届生没啥,但是问一个资深的程序员,人家会感受到不重视,感受到不礼貌,毫无信任感,问一些跟资深程序员相匹配的问题才是重点,从另一方面来说,如果问这种简单的问题,反应了面试管的能力差,毫无区分度,即使后面面试好坏,第一步就已经面试失败了,即使是个大牛心里也会打鼓,不要尝试去挑战底线,明知会反感,还这样问就是无知。就像很多人问程序员你会不会修电脑,类似这种问题,所以面试还是一个学问,在不引起面试者反感的情况下,尽可能完全的了解面试者的能力。
    lzlee
        133
    lzlee  
       2020-08-20 17:01:14 +08:00
    我不觉得, 这能说明什么本质上的问题
    不投缘吧

    换个角度
    如果一个面试者说, 某个面试官面试问了这道题, 那这个公司肯定不行
    你看了你是什么想法

    一道题说明不了什么问题, 面试那么长时间, 一些列的沟通从经历到语言描述, 再到沟通能力, 学习能力
    这些东西不比这道题有意思的多吗?
    ipoh
        134
    ipoh  
       2020-08-20 17:02:10 +08:00
    @phpfpm res.length 这个 get 到没
    ipoh
        135
    ipoh  
       2020-08-20 17:08:45 +08:00
    @phpfpm 你的实现没考虑 res.length 是不是长整数
    ipoh
        136
    ipoh  
       2020-08-20 17:09:45 +08:00
    正确的解法 /提问,给几个简单的位操作和内存访问指令,实现长整数加法
    phpfpm
        137
    phpfpm  
    OP
       2020-08-20 17:14:43 +08:00
    @ipoh 2333
    你确定有那么长的字符串么。。。
    不太清楚 js 是否支持 pb 级别的字符串

    但是内存应该是爆了。。
    Mohanson
        138
    Mohanson  
       2020-08-20 17:17:16 +08:00 via Android
    题目水平可以再难一点,比如如何从半加器开始实现加法
    ipoh
        139
    ipoh  
       2020-08-20 17:18:40 +08:00
    @phpfpm 你确定字符串一定要放在内存里么,js 支持不支持 pb 级别的字符串不清楚,但是一定有办法处理 pb 级别的字符串

    既然较真,就应该把答案搞完美点,不然随便一看就是漏洞
    buffzty
        140
    buffzty  
       2020-08-20 17:27:40 +08:00
    我觉得问这个题可以,而且很简单. 但是楼主说话一股崽种的味道. 别人完成就行,非要跟你写法一样才行是吗?
    抓到一点就黑,自己单词写错了 还说别人? 而且单词拼错,api 记不住这种是技术能力问题吗
    aguesuka
        141
    aguesuka  
       2020-08-20 17:32:44 +08:00 via Android
    这是一个好题目,可以过滤掉不会写代码和稍微有点心气的求职者。配合笔纸写代码效果更佳
    xwhxbg
        142
    xwhxbg  
       2020-08-20 17:35:36 +08:00   ❤️ 9
    楼主,这是我恰好知道所以你必须知道的典型例子啊
    既然楼主觉得 big int 加法写不出来就是没有 coding 能力,请问楼主能手写一个反向传播梯度下降的神经网络库吗?
    不能==没有 coding 能力?
    虽然手写反向传播在机器学习领域是一个入门问题,但是对于不是写机器学习库的人以及平时搬砖的码农,这个问题现场写八成写不出来
    以楼主的“coding 能力标准”,现场能写成这样的,要么是神仙,要么是背过题,什么边界条件检查,什么循环控制,字符串操作都是虚的,就是考验选手背过跟考官一样的题没

    2020 年了,边界检查还通过拍脑袋想实现么?都是通过写测试用例,反复完善边界检查,反复修正逻辑实现的
    软件工程不是考验大家拍脑袋的能力,而是通过一套系统的相对完善的方案去实施一个工程,过程中通过工程上的设计尽量避免或者减少错漏

    以楼房建造为例,楼主可能是 MIT 博士,设计了一种高效又好用的砖,但是这个砖如果没博士学历连使用说明书都读不懂,而其他人设计的砖虽然效率可能只有楼主的 60%,而且不是那么好用,但是高中毕业就能用,并且通过简单的约束甚至能达到 65%的效率

    如果楼主跟我类似也是小公司 CTO 这种档次的话,建议招人优先考虑执行力和用搜索引擎的能力,我的感受是我设计一套实现方案,也许包含 TDD,持续集成等等比较繁琐的东西,甚至还有 git hook 防止提交错误代码,但是我不希望执行者通过--ignore 来忽略这些

    也许执行者有他自己的想法,有时甚至很好,但是工程问题很少是技术问题,我的优先级是 work,correct,最后才是 fast,也许大佬起手就是想 fast,但是我要考虑大佬离职以后,我招个刚毕业的学生能个把月上手大佬的代码,我得要求大佬写最基本的语法,最低的技术含量,实现最基本的功能

    这样即使大佬有些边界条件没检查到,其他人也能上手慢慢完善

    如果楼主是达摩院招研发就忽略我的言论哈
    beidounanxizi
        143
    beidounanxizi  
       2020-08-20 17:45:59 +08:00
    出 coding 没什么问题 抛开招聘条件和薪资待遇
    就单单楼主是高考出卷老师 你觉得出字符串的整数相加 就 能考察应聘面试者的基本能力么?
    要是我是考生 我就喷了。
    建议 有备选题目 做不出也不是什么见不得人的事
    JerryCha
        144
    JerryCha  
       2020-08-20 17:48:37 +08:00
    appendix II 基本就是 LeetCode 链表加法的做法了吧
    lake325
        145
    lake325  
       2020-08-20 17:52:48 +08:00
    楼主如果不事先有准备,能用这么短的代码实现吗?
    phpfpm
        146
    phpfpm  
    OP
       2020-08-20 18:02:34 +08:00
    @buffzty 我发了那么多讨论你都看不见抓到一点就黑的是你吧。。。。。
    @beidounanxizi 把讨论看完。这道题是高效筛选不合适的面试者的题。
    @Mohanson 不 那就没人了。

    @ipoh 杠将军你好~

    @beidounanxizi 当然有备选题目,但是备选的更难。而且这个题目相当有区分度。

    @xwhxbg 逻辑上来说你的题目更难,所以区分度更差
    knowckx
        147
    knowckx  
       2020-08-20 18:02:58 +08:00
    leetcode 415 刷过类似的题应该就做得出
    gaocc
        148
    gaocc  
       2020-08-20 18:07:45 +08:00   ❤️ 2
    招的人主要是来写业务的是吧
    个人觉得考校沟通能力和读代码能力,比写一道技术题来的直接。
    比如拉出一个可对外的项目代码,给个需求,让读个 20 分钟代码,问解决方案。观察下对方先后怎么处理的,是来确认需求,还是闷头看代码,还是去跑项目等等。
    看人处理问题方式,能看出的东西比较多。
    ipoh
        149
    ipoh  
       2020-08-20 18:08:22 +08:00
    @phpfpm 指出你的错误就是杠么?
    建议你好好搜一下正确答案,然后对比一下。
    你的答案离合格太远
    这道题的难度可能和你想的并不一样,也能考验出题人的水平
    gaocc
        150
    gaocc  
       2020-08-20 18:12:36 +08:00
    @gaocc 补一句,我看到题第一反应是,这需求描述都不清晰,不合理不想做哈哈哈哈。较真自己做,也是做不好,我也是业务类同学,经常觉得读代码然后‘借用’,会比自己想逻辑写代码,实际效果好,速度快。
    注:搞底层的同学切勿模仿这心态 hhhh
    ZehaiZhang
        151
    ZehaiZhang  
       2020-08-20 18:16:47 +08:00
    刷 leetcode 刷到过印象,不过不是很清楚 lz 的 Emca Script (也许应该是 Ecmascript ),记得是 JavaScript 的标准,而不是语言,这个两个词语日常是等价的吗?
    buffzty
        152
    buffzty  
       2020-08-20 18:22:18 +08:00
    @phpfpm 1. 我拿你正文加批注 评论算找到一点就黑吗? 2. 我只说了一点吗? 3. 我说的哪点不对吗?
    phpfpm
        153
    phpfpm  
    OP
       2020-08-20 18:29:49 +08:00
    @all

    你们聊吧这个问题我已经 get 到足够多的信息了

    谢谢你们的批评指正,之后应该不会单独回帖了。
    rzWack
        154
    rzWack  
       2020-08-20 18:36:46 +08:00 via Android
    XisucksYi
        155
    XisucksYi  
       2020-08-20 19:19:05 +08:00
    func addStrings(num1 string, num2 string) string {
    var res []int = make([]int, 0, 0)

    var carry int = 0

    for p1, p2 := len(num1) - 1, len(num2) - 1; p1 >= 0 || p2 >= 0; p1, p2 = p1 - 1, p2 - 1 {
    var x1 int = 0
    var x2 int = 0
    if p1 >= 0 {
    x1 = int(num1[p1] - '0')
    } else {
    x1 = 0
    }
    if p2 >= 0 {
    x2 = int(num2[p2] - '0')
    } else {
    x2 = 0
    }
    var value int = (x1 + x2 + carry) % 10
    carry = (x1 + x2 + carry) / 10
    res = append(res, value)
    }

    if carry > 0 {
    res = append(res, carry)
    }

    for i := 0; i < len(res) / 2; i = i + 1 {
    res[i], res[len(res) - i - 1] = res[len(res) - i - 1], res[i]
    }

    var result string = strings.Trim(strings.Replace(fmt.Sprint(res), " ", "", -1), "[]")
    return result
    }

    這樣?
    zhangzhang
        156
    zhangzhang  
       2020-08-20 19:22:12 +08:00
    我想起来 noip 必背的几个算法里面就有高精度加减乘除,因为当时不开放 Pascal 的 int64 。。。
    XisucksYi
        157
    XisucksYi  
       2020-08-20 19:25:42 +08:00
    這個鳥題跟 leetcode 第二題差不多, 就是第二題可以直接加, 這個要 reverse 一次.

    第二題還更有意義點, 這個題平時誰不用 built-in, 誰去這樣寫?
    blurryWu
        158
    blurryWu  
       2020-08-20 19:34:10 +08:00
    作为一个应届生或则在校大学生考察这个问题我觉得没啥问题,如果是考社招的话,刷题和算法就不是筛选的必选项了吧.作为在校学生贴个代码吧
    ```C++
    void add_string(string& ans, string cur, int cnt) {
    string str1(ans);
    for (int i = 0; i < cnt; ++i)
    cur.insert(0, "0");
    string str2(cur);
    int l1 = 0, l2 = 0, carry = 0;
    string s;
    while (l1 < str1.size() || l2 < str2.size()) {
    int tmp = 0;
    tmp += carry;
    if (l1 < str1.size()) {
    tmp += str1[l1] - '0';
    l1++;
    }
    if (l2 < str2.size()) {
    tmp += str2[l2] - '0';
    l2++;
    }
    carry = tmp / 10;
    s.push_back(tmp % 10 + '0');
    }
    if (carry) s.push_back(carry + '0');
    ans = s;
    return;
    }
    XisucksYi
        159
    XisucksYi  
       2020-08-20 19:34:43 +08:00
    講錯了, 從前面 append 就不需要 reverse 了

    func addStrings(num1 string, num2 string) string {
    var res []int = make([]int, 0, 0)

    var carry int = 0

    for p1, p2 := len(num1) - 1, len(num2) - 1; p1 >= 0 || p2 >= 0; p1, p2 = p1 - 1, p2 - 1 {
    var x1 int = 0
    var x2 int = 0
    if p1 >= 0 {
    x1 = int(num1[p1] - '0')
    } else {
    x1 = 0
    }
    if p2 >= 0 {
    x2 = int(num2[p2] - '0')
    } else {
    x2 = 0
    }
    var value int = (x1 + x2 + carry) % 10
    carry = (x1 + x2 + carry) / 10
    res = append([]int{value}, res...)
    }

    if carry > 0 {
    res = append([]int{carry}, res...)
    }

    var result string = strings.Trim(strings.Replace(fmt.Sprint(res), " ", "", -1), "[]")
    return result
    }

    媽的, 這個題真的噁心
    blurryWu
        160
    blurryWu  
       2020-08-20 19:38:11 +08:00 via iPhone
    @blurryWu 补充一下,这是我从大数乘法里截取出来的加法,还需要 reverse 下。
    b00tyhunt3r
        161
    b00tyhunt3r  
       2020-08-20 19:46:13 +08:00
    楼主不是科班吧,还是前端的?
    这“题”用函数式或者低级语言有任何难度可言吗,这能招到什么神仙。。
    XisucksYi
        162
    XisucksYi  
       2020-08-20 19:53:40 +08:00
    因為 JSON 不支持 BigInt, 真實情況對於 JS, 直接轉換成 BigInt 處理, 處理完再轉回 string.

    對於沒有 JS 那種情況的語言直接轉換成 int64, 處理完再轉回 string.

    這題主要就是針對 JavaScript, 應該是出現在 BigInt 推出之前.
    glfpes
        163
    glfpes  
       2020-08-20 19:53:58 +08:00
    这好像是 leetcode.cn 的第二题,只不过第二题输入是 1 个链表。
    XisucksYi
        164
    XisucksYi  
       2020-08-20 19:58:53 +08:00
    @XisucksYi 不對, 看那題目, 就是針對 JS 的 BigInt 來噁心一下罷了
    sinORcos
        165
    sinORcos  
       2020-08-20 20:02:23 +08:00
    作为程序员,我可能不是楼主的对手,毕竟楼主开着会还在百忙之中抽出时间来回复大家。

    我就说两点:

    第一,不知楼主在何处高就,会对代码提出“优雅”这种要求,说到底,“优雅”的代码究竟算是个什么评价标准?
    第二,我很不爽楼主这种不好好说话非要夹带个英文单词的,如果你带的是专用名词或者使用中文很难做到信达雅的也就算了,“get 到足够多的信息”算什么鬼?就感觉楼主这人本身缺少教养,很不懂礼貌。
    ipoh
        166
    ipoh  
       2020-08-20 20:03:01 +08:00
    @XisucksYi
    @glfpes
    这题比 leetcode 上面的麻烦,leetcode 上面限定了范围,他这个没有限定。你的实现默认了字符串不是长整数,是有问题的
    ipoh
        167
    ipoh  
       2020-08-20 20:04:33 +08:00
    @blurryWu 你的实现也有问题,这楼里大部分人都没考虑到字符串长度本身也是长整数的情况。
    XisucksYi
        168
    XisucksYi  
       2020-08-20 20:05:40 +08:00
    @ipoh 加倍噁心, 鄙視
    ipoh
        169
    ipoh  
       2020-08-20 20:06:26 +08:00
    @ziwiwiz 这么多实现里面就你的是正确的,凡是取了字符串长度的都有问题。
    XisucksYi
        170
    XisucksYi  
       2020-08-20 20:07:48 +08:00
    @glfpes 鏈表的話, 真實情況就是直接遍歷 next node 來處理啊, 他這個真實情況誰吃太飽去這樣處理, 肯定用 BigInt 啊
    XisucksYi
        171
    XisucksYi  
       2020-08-20 20:11:55 +08:00
    @ipoh 你是說 string 的長度超過 JS 的 number 精度? 這題目的就是這個, 肯定超過的
    Exin
        172
    Exin  
       2020-08-20 20:15:11 +08:00
    技痒参与一下,递归做的,不一定对(应该没人无聊到说非要把递归写成循环的形式才叫算法解法吧?

    ```js
    function add(a, b, ai = 1, bi = 1, carry = 0, tail = "") {
    if (a.length < ai && b.length < bi) return (carry || "") + tail;
    const sum = parseInt(a[a.length - ai] || "0") + parseInt(b[b.length - bi] || "0") + carry;
    return add(a, b, ai + 1, bi + 1, sum > 9 ? 1 : 0, (sum > 9 ? sum - 10 : sum) + tail);
    }
    ```
    loryyang
        173
    loryyang  
       2020-08-20 20:15:40 +08:00
    这种题目写不出,我一般直接就 fail 了。这种代码已经比较接近业务代码了,循环然后做处理。说实话,如果不准备过,快排比这种题目难写,因为快排边界和终止条件很难写正确,思维上面难度更大。相比较而言,要难一点的话,我更倾向出树这个结构的题
    另外,面试官对代码写法提出各种要求是极为常见的考察手段,这是观察面试者对知识的掌握程度。能灵活写出多种解法的人,才有可能对代码进行更合理的重构,得到更优的写法
    Exin
        174
    Exin  
       2020-08-20 20:16:42 +08:00
    @Exin #172 发出才发现 ai 和 bi 可以合成一个 i,哈哈
    ipoh
        175
    ipoh  
       2020-08-20 20:18:39 +08:00
    @XisucksYi 对,leetcode 上面是有考虑到这个问题的。其实这是一个很常见的错误,提问者自己也没考虑到,也不知道他有没有 coding 能力
    ipoh
        176
    ipoh  
       2020-08-20 20:21:50 +08:00   ❤️ 1
    @Exin a.length 可能是个长整数
    zhuangzijun1996
        177
    zhuangzijun1996  
       2020-08-20 20:41:06 +08:00 via Android
    @phpfpm 写代码优先考虑的难道不是可读性和思考难度么 显然倒一倒至少看起来会舒服很多。。
    XisucksYi
        178
    XisucksYi  
       2020-08-20 20:48:53 +08:00
    @ipoh 那就把遍歷的方式從 length 改成 remove 最後一個字符, 一個個取出來處理, 直到兩個 string 都為 "" 為止
    XisucksYi
        179
    XisucksYi  
       2020-08-20 20:55:12 +08:00
    @ipoh pop 好像必須知道數組的長度啊, 那只有 top 出來了, 然後 reverse
    liuminghao233
        180
    liuminghao233  
       2020-08-20 21:11:26 +08:00 via iPhone
    这个不难
    但不是
    vanxy
        181
    vanxy  
       2020-08-20 21:29:23 +08:00
    业务代码为主,如果有人写的代码类似楼主解法这样带位运算的,是会被接手的人打死的。
    XisucksYi
        182
    XisucksYi  
       2020-08-20 22:02:13 +08:00
    @phpfpm 這題的目的就是針對 JS 的, 之所以傳入的參數是 string 是因為 JS 的 Number 限制, 要加到轉換成 string 才行, 所以肯定是超出 Number 的限制的, 你這樣直接取 length, 如果在 JS 裡, string 長度超出 Number 的精度, 肯定報錯, 但就是因為肯定是超出 Number 精度, 這才是參數是 string 的意義所在. 這也是這題的背景意義, JS 的 BigInt 出來之前處理 JSON 中的 string 的辦法.

    像你這樣根本沒想過為什麼參數是 string 就不知羞恥的搞一個什麼篩選面試者, 你要是碰到沒耐心的, 打到你躲到派出所都沒用.
    phpfpm
        183
    phpfpm  
    OP
       2020-08-20 22:07:17 +08:00
    @XisucksYi 我真的不明白这个点为啥可以杠这么久,查查标准吧
    (虽然我都说不想回了就回一句这个)

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length

    string 的最长长度就是 int max, 2^53 -1

    如果两个数都是这么长,和是 2^53 的长度,无法用 string 来表示,无法用字符串去输出

    而不是一个长度合法的字符串的和的长度无法用 int 来表示。

    再说 2e53byte=2e43KiB=2e33MiB=2e23GiB = 2e13TB = 8PB

    你认真的吗?

    抓住这个不放就是杠。
    XisucksYi
        184
    XisucksYi  
       2020-08-20 22:17:25 +08:00
    @ipoh 這個 string 長度感覺跟 Number 精度感覺不是一回事
    XisucksYi
        185
    XisucksYi  
       2020-08-20 22:24:38 +08:00
    @phpfpm 這跟 string 的最大長度有什麼關係, Number 的最大值為 9007199254740991, 如果 string 為 "90071992547409911" 呢? 取 length 是不是報錯?

    你真的是沒搞懂這題的意義, 就這樣你還面試個鬼
    XisucksYi
        186
    XisucksYi  
       2020-08-20 22:25:59 +08:00
    @phpfpm 搞錯了, 確實取 length 沒問題, 但是你這樣還是會被打
    phpfpm
        187
    phpfpm  
    OP
       2020-08-20 22:30:50 +08:00
    @XisucksYi 打就打吧,我都皮了~

    @XisucksYi 哈哈哈哈手动狗头!! 185 楼,总算 get 到你的点了~~~
    laminux29
        188
    laminux29  
       2020-08-20 22:35:41 +08:00
    出题人,也就是题主,很熟悉某类问题,并且觉得,大部分这种工资等级的人,都能解决这个问题。

    建议题主加一些面试官或 HR 群,与这些人讨论一下,这个工资等级,能按照题主的思路,解决这个问题,概率有多大。

    我觉得你在这个论坛的这版块,发这个问题,作用不大。因为这种大多数人是程序员,而非面试官或 HR 。
    dustinth
        189
    dustinth  
       2020-08-20 22:50:22 +08:00
    如果有人跟我讲他怎么 google 一个合格的算法库; 怎么针对这个问题设计 test case; 怎么包装隐藏第三方库不必要的复杂度, 即使他自己写不出来, 我也认为他是一个合格的工程师.
    phpfpm
        190
    phpfpm  
    OP
       2020-08-20 23:11:36 +08:00
    @dustinth 能做到的这个更少。


    @laminux29 我并不是因为我很熟悉这类问题,我是觉得这类问题站在面试官的角度容易有区分度。

    而且我们招聘其实要求已经放的蛮高了,senior 的社招,这个都答不上来的往往架构方面回答的更加揪心。

    我前面也说了,这个问题虽然 2,但是能拒绝掉 60%+的面试者。

    这 60%里面问问项目经验,有大部分直接就挂了

    剩下的小部分,总量的 10%,加面更纯粹的算法题考察思路。

    talk is cheap, show me the code.
    billlee
        191
    billlee  
       2020-08-21 00:07:03 +08:00
    这个是数字电路里面的基本内容吧,这都写不出来可以当作完全不懂计算机体系结构和算法了。
    thinkdeep
        192
    thinkdeep  
       2020-08-21 00:32:58 +08:00
    这种就是我不要你觉得行不行,我要我觉得行就行。
    ipoh
        193
    ipoh  
       2020-08-21 00:40:20 +08:00 via Android
    @phpfpm 无法用 js 里面的 string 表示的大数就没法处理了?那你要是在我这里面试也是不合格哦
    更别说用 c 语言的怎么办,根本没 string 这个东西

    楼里有正确答案你可以参考,要是想出题呢可以学学 leetcode
    ipoh
        194
    ipoh  
       2020-08-21 00:42:24 +08:00 via Android
    @XisucksYi 取 length 导致这个解答只能处理“比较小”的大数加法
    iEverX
        195
    iEverX  
       2020-08-21 00:48:28 +08:00   ❤️ 2
    我理解这道题目不能称之为算法,就是考察最基本的思维能力以及代码实现能力。如果这都算是高要求,那么什么才是正常要求呢,难道一个数组遍历输出吗?
    shmichaelli
        196
    shmichaelli  
       2020-08-21 00:50:17 +08:00
    @xwhxbg 感觉您的回答很专业,赞一个.
    ipoh
        197
    ipoh  
       2020-08-21 01:09:16 +08:00 via Android
    @phpfpm 而且就算用你所谓的 js 语言限制,你的答案时间复杂度也不符合要求。
    还是先优化好自己的答案再来考别人吧
    ChanKc
        198
    ChanKc  
       2020-08-21 01:10:44 +08:00 via Android
    emca script 是个啥
    面试这种东西,你当然可以有自己的标准,反正人招进来干一段时间大家就知道你的面试标准对不对了
    yangbonis
        199
    yangbonis  
       2020-08-21 01:20:56 +08:00 via iPhone
    你这不就模拟了个加法器吗?和业务有关?记得上学的作业写过浮点加法器会复杂一些。

    最通用的方法还是各语言明星项目模块现场加个功能,复杂功能设计起码要契合原本代码的逻辑。对面试者和面试官水平要求都高。

    不懂?连明星项目都没看过也算懂 xx 语言?
    zongwan
        200
    zongwan  
       2020-08-21 01:27:23 +08:00
    看明白了
    面试官问的问题自己都没有足够优雅的答案
    从面试者的答案中学习然后不断优化找到了觉得足够优雅答案

    但最后也发现了这个问题"大数"存在一定边界
    如果面试者反问 "大数"超出边界, 会被当成"坚持抖机灵"
    ---
    那么抖个机灵
    最后这个问题的定义应该是 这个"大数"只准相加且存在边界
    如果不存在限制就简单了, 计算出实际数字应该也就无实际意义=无需计算

    加法的话直接 (m, n)=> m + '+' + n; 把结果直接写入单个 /多个文件
    减法同理
    乘法 (m, n)=> '(' + m + '*' + n + ')'; (写入文件时可根据文件的设计结构去掉括号)
    除法同理

    使用 文件夹+文件 的文件树存储就不错
    例如:
    |-- *
    | |-- +
    | | |-- m
    | | |-- n
    | |-- b (例: b 需要多个文件表示时)
    | | |-- b0
    | | |-- b1

    以上结构表示为 ( m + n ) * b
    1  2  3  4  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2968 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 03:25 · PVG 11:25 · LAX 20:25 · JFK 23:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.