Hackerrank比较三元组问题:为何两种forEach实现方案效果不同?
两种forEach实现的得分计算差异解析
问题说明
我了解已有不少关于比较三元组得分问题的讨论,这里想搞清楚为什么下面两个基于forEach的实现(方案X和方案Y)运行结果不一样:方案X用forEach的value参数对比数组A和同索引的数组B元素;方案Y则通过索引参数定位两个数组的元素做对比。
方案X代码
function compareTriplets(a, b) { let pointsA = 0; let pointsB = 0; a.forEach((value, index) => { if(value > b[index]) { pointsA=+1 } else if (value < b[index]) { pointsB=+1 } else { return; } }) return [pointsA, pointsB]; }
方案Y代码
function compareTriplets(a, b) { let ascore = 0, bscore = 0; a.forEach((item, i) => { (a[i] > b[i]) && ascore++; (b[i] < b[i]) && bscore++; }); return [ascore, bscore]; }
输入示例
17 28 30 99 16 8
差异原因分析
方案X的错误
方案X里的pointsA=+1和pointsB=+1是赋值操作,不是累加。=+1的意思是把变量直接设为1,而不是在原有数值上加1。正确的累加写法应该是pointsA += 1或者pointsA++。这就导致不管满足多少次得分条件,最终pointsA和pointsB只能是0或1,无法正确累计得分。
方案Y的错误
方案Y的第二个判断条件写错了:(b[i] < b[i])是一个永远为假的表达式(一个数不可能小于它自己),所以bscore永远不会增加。正确的条件应该是a[i] < b[i]或者b[i] > a[i]。这直接导致方案Y无法正确计算B的得分。
预期正确结果
针对给定的输入示例,正确得分应该是[2, 1](A在28>16、30>8时各得1分,B在17<99时得1分)。方案X会返回[1,1],方案Y会返回[2,0],这就是两者表现不同的核心原因。
内容的提问来源于stack exchange,提问作者Exodus Reed
相关产品推荐
相关产品推荐

