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

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

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

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

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

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

这题难吗?

考察的知识点点挺广的:

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

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

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

等等吧

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

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

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

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

如果要你写,你写啥?

24203 次点击
所在节点    程序员
321 条回复
Boyce
2020-08-20 14:52:07 +08:00
@XisucksYi 大佬就是不一样(没讽刺),我校招时同学,社招时同事就只见过一个技术面试没准备的,其他的都刷过题,背过面经。
raysonlu
2020-08-20 15:02:15 +08:00
能解决业务的代码才是好代码
phpfpm
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
2020-08-20 15:06:23 +08:00
这题也就沾一点点算法,侧重点还是在编码实现上。这个算法本身用 竖式加法/按位相加 就可以描述,但实现起来很容易写错,也很容易漏掉对各种边界条件的处理、考虑。这个是很能看出能力的
XisucksYi
2020-08-20 15:13:19 +08:00
@phpfpm "如果这个做不好平时工作做一些逻辑的东西写出来的代码一定不敢恭维", 你當人家不會用 Google? 誰寫代碼直接寫? 誰不是直接 copy 過來改的?
myself659
2020-08-20 15:14:35 +08:00
用 c 基本上不用 10 分钟可以写完
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
2020-08-20 15:19:51 +08:00
写是能写出来的,就是要一边写一遍百度,思路知道,但是 api 记不住啊,比如取最后一位,逆转,还有字符串转 int,全都要百度
thinkdeep
2020-08-20 15:27:22 +08:00
只能说楼主能力不行,思维僵化,看见这种人就反感,非常反感,自以为是,还在纠结这小小问题,技术能力 99%肯定不怎么样,多面试几方面,有可能会发现不一样的地方。
maplelin
2020-08-20 15:30:47 +08:00
@XisucksYi #96 然后呢,FAANG 哪家面试不考算法?不要因为个别面试官否认算法对人才能力水平的考验
moooookey
2020-08-20 15:32:19 +08:00
回字有几种写法
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
2020-08-20 15:38:32 +08:00
讲道理,第一这题没什么实际意义,考察这种没有使用场景的 string 操作不如考察各种 substring 之间的骚操作,起码有的时候还能用到,非要让人实现一个竖式计算器有点愚蠢
第二,我年轻的时候也喜欢把代码写的很酷炫,什么位运算啦什么元编程啦什么 magic number 啦,但是现在除了一些 functional 的写法,我都不会在涉及工程开发的项目里用了,就算用也要把原理写的明明白白的,作为一个合格的工程师,写出来的代码提供良好的可读性,可以让傻子都轻松看懂,是一种义务
nevin47
2020-08-20 15:42:44 +08:00
LZ 没毛病
长整数运算,就算是没准备,临场了也想不出来的,不指望后面能写出啥好代码
phpfpm
2020-08-20 15:48:26 +08:00
@Marstin
@thinkdeep

我是这么理解的。

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

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

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

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

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

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

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

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

之前有一个面试者写 array.reduce 的时候问我哪个参数代表原数组,他写到第二个参数的时候代码编辑器的函数签名已经提示的很明确了——虽然是英文的,连这个都不看的或者看不懂的 emmm

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

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

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

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

© 2021 V2EX