我在CodeSignal上执行isLucky任务时,代码总是返回true。我该怎么做才能解决这个问题?
任务:如果前半位数字之和等于后半位数字之和,则认为该票号是幸运的。
给定一张彩票号码n,判断它是否幸运。
我试着用
if(first == second) {
return true;
} else {
return false;
}
function isLucky(n) {
var half = n.length/2;
var first = 0;
var second = 0;
for(var i = 0; i < half; i++) {
first += n[i];
}
for(var j = half+1; j < n.length; j++) {
second += n[j];
}
if(first != second) {
return false;
} else {
return true;
}
}
其中一项实践测试为n = 239017;我希望它返回false,但它返回true。
6条答案
按热度按时间uelo1irk1#
JavaScript解决方案
s5a0g9ez2#
n
是一个数字,数字没有length
属性或数字索引。记住这一点,我们可以看到代码的重要部分永远不会运行:Converting
n
to a string解决了这些问题,但是现在isLucky
总是返回false
。阅读函数,我们期望first
包含n
前半部分的数字之和,second
包含后半部分的数字之和。在函数返回之前记录first
和second
的值,以检查该假设:这些不是和,也不是偶数(stack snippet控制台没有显示,但Chrome和Firefox的控制台记录的数字是彩色的,字符串是黑色的,这些都是字符串)。
这是因为
n[i]
是一个字符串,而+
是字符串的连接,用Number(n[i])
或+n[i]
将它们转换成数字,isLucky(239017)
就可以工作,但其他数字仍然有问题:看起来后半部分的第一位数没有包含在总和中。您可以在早期版本中看到这种情况:如果将
second
初始化为0
,我们将期望与'239017'
的后半部分连接的字符串为'0017'
,但我们得到的是'017'
。从
half
而不是half + 1
开始第二个循环(并删除诊断日志),isLucky
工作正常:irtuqstp3#
JS中的溶液
7ajki6be4#
enyaitl35#
(1).仅当n为String或Array而非Integer时,length属性才有效
var half = n.length/2;
需要先将整型转换为字符串。
n = n.toString();
(2).当你需要字符串中的任何一个特定的数字字符时,你需要将字符类型转换为整数。
sum½ += parseInt(n[index])
(3).第一个和在一半处停止,不检查精确索引=
half
处的字符。因此第二求和应当以下标=
half
而不是half + 1
开始。for(var j = half; j < n.length; j++) {
当布尔结果取决于条件时,您可以执行 *
return (first == second);
qacovj5a6#