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

2020-08-20 11:02:09 +08:00
 phpfpm

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

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

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

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

这题难吗?

考察的知识点点挺广的:

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

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

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

等等吧

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

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

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

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

如果要你写,你写啥?

22777 次点击
所在节点    程序员
321 条回复
islxyqwe
2020-08-20 11:07:07 +08:00
const add = (a,b)=>(BigInt(a) + BigInt(b)).toString()
phpfpm
2020-08-20 11:07:45 +08:00
@islxyqwe 好的,下一位,被面试官打死了。
march1993
2020-08-20 11:08:45 +08:00
都字符串了 那就按字符串按位拼呗…
luckyrayyy
2020-08-20 11:10:00 +08:00
我应该就是啰啰嗦嗦那种了。循环,字符取一位,转成 int,相加,记录进位,剩余的转回 str 加到结果上。
Jooooooooo
2020-08-20 11:11:57 +08:00
我理解写 a+b 如果是 string 就是考察最基本的代码能力

如果是 int 那考察思考全面性 (溢出怎么办?
dartabe
2020-08-20 11:13:16 +08:00
我咋看好多答案都用的 bigint
phpfpm
2020-08-20 11:16:35 +08:00
@Jooooooooo 溢出就 try-catch 一下吧,前置判断没啥意思了

@dartabe big int 用了我考啥。。。我也是反复强调不能用(当然绝大多数面试者不知道 hhh )
主贴写的时候写漏了。


@march1993
@luckyrayyy
真的写一下估计会漏一些情况(比如最后的进位)
hytex
2020-08-20 11:18:39 +08:00
怎么感觉是字符串相加的那个题… 按位取余多的进 1,然后叠加就行了啊…
hytex
2020-08-20 11:19:27 +08:00
@hytex 字符串 append 最后倒一下…
lijialong1313
2020-08-20 11:19:54 +08:00
字符串 /数组,反转处理不好吗……

而且不能转 number 的话,难不成是两个字符串加起来之后减去对应的值?( C 语言)
DL9412
2020-08-20 11:21:29 +08:00
这不是上周的每日打卡题么,模拟竖式就完事了
phpfpm
2020-08-20 11:22:49 +08:00
@lijialong1313 c 处理 atoi 也确实可以这么干
主要是反转吧必要性没那么大
太多人只会正着写 for,不会反着写 for,不会写 while ;
或者你要用 map-reduce 之类的方法把字符串先 reverse 我还能忍


@hytex 话是这么说,欢迎提供代码~
能贴条的时候我补充我的版本。
phpfpm
2020-08-20 11:23:51 +08:00
@DL9412 talk is~~~ show us your code~~~
hytex
2020-08-20 11:26:12 +08:00
@phpfpm 格式我不会弄这个,每日一题我做过这个。

public String addStrings(String num1, String num2) {
int a = num1.length() -1 , b = num2.length() - 1 , add = 0;
StringBuffer ans = new StringBuffer();
while(a >= 0 || b >= 0 || add != 0 ) {
int x = a>=0 ? num1.charAt(a) - '0' : 0;
int y = b>=0 ? num2.charAt(b) - '0': 0;
int res = x + y + add;
add = res / 10 ;
ans.append(res % 10);
a -- ;
b --;
}
ans.reverse();
return ans.toString();
}
lijialong1313
2020-08-20 11:26:59 +08:00
@phpfpm 主要是不反转的话,对于最左的进位就需要额外的一次移动所有字符串操作( c 语言),我做 oj 遇到这种都是习惯反着处理。
hytex
2020-08-20 11:27:35 +08:00
@hytex 如果最后反转不能 reverse,那再稍微处理下就好了…
yhxx
2020-08-20 11:28:54 +08:00
import { BigNumber } from 'big-number';

return BigNumber(a).add(b);

(手动滑稽
phpfpm
2020-08-20 11:29:40 +08:00
@lijialong1313 你可以输出的结果是反着的,都拼好了统一反转一次(逃


@hytex goodjob,还能再短点么(虽然我知道 java 的代码量要除以 2 hhh
lijialong1313
2020-08-20 11:31:36 +08:00
@phpfpm 那这样的话,这玩意儿应该满地都是大数加法算法了吧( C 语言)
hytex
2020-08-20 11:32:38 +08:00
@phpfpm 我看了大佬的,确实可以短一些,不过我个人水平做这个题就这样了 :D

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/699860

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX