我在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。
答案 0 :(得分:0)
n
是一个数字,数字不具有length
属性或数字索引。考虑到这一点,我们看到您的代码的重要部分永远不会运行:
function isLucky(n) {
var half = n.length/2; // n.length is undefined; undefined / 2 is NaN
var first = 0;
var second = 0;
// (0 < NaN) is false; this loop never runs
for(var i = 0; i < half; i++) {
first += n[i];
}
// NaN + 1 is NaN, (NaN < undefined) is false; this loop never runs
for(var j = half+1; j < n.length; j++) {
second += n[j];
}
// Nothing has happened since first and second were both set to 0; return true
if(first != second) {
return false;
} else {
return true;
}
}
Converting n
to a string解决了这些问题,但是现在isLucky
始终返回false
。通读该函数,我们期望first
包含n
的前半部分的数字之和,以及second
下半部分的总和。在函数返回之前记录first
和second
的值,以检查该假设:
function isLucky(n) {
n = n.toString();
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];
}
console.log(first, second);
if (first != second) {
return false;
} else {
return true;
}
}
console.log(isLucky(239017));
这些不是总和。他们甚至不是数字。 (堆栈片段控制台未显示它,但是Chrome和Firefox的控制台以彩色记录数字,以黑色记录字符串。这些是字符串。)
这是因为n[i]
是一个字符串,而+
is concatenation for strings是一个字符串。用Number(n[i])
或+n[i]
将它们转换为数字,isLucky(239017)
可以工作。但是其他数字仍然有问题:
function isLucky(n) {
n = n.toString();
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];
}
console.log(first, second);
if (first != second) {
return false;
} else {
return true;
}
}
console.log('239017 (should be false):', isLucky(239017));
console.log('123321 (should be true):', isLucky(123321));
console.log('123933 (should be false):', isLucky(123933));
看起来下半部分的第一位未包含在总和中。您还可以看到在较早版本中也发生了这种情况:将second
初始化为0
时,我们期望与'239017'
后半部分的字符串串联为'0017'
,但取而代之的是'017'
。
从half
而不是half + 1
开始第二个循环(并删除诊断日志),isLucky
正常工作:
function isLucky(n) {
n = n.toString();
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; j < n.length; j++) {
second += +n[j];
}
if (first != second) {
return false;
} else {
return true;
}
}
console.log('239017 (should be false):', isLucky(239017));
console.log('123321 (should be true):', isLucky(123321));
console.log('123933 (should be false):', isLucky(123933));
答案 1 :(得分:0)
JavaScript解决方案
function isLucky(n) {
let count = 0;
n = String(n).split('').map(t => {return parseInt(t)});
n.forEach( (el, i) => { (i < n.length / 2) ? count += el : count -= el });
return count == 0;
}