isLucky任务-CodeSignal;即使else语句默认为false,也保持运行为真

时间:2019-04-05 22:30:24

标签: javascript

我在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。

2 个答案:

答案 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下半部分的总和。在函数返回之前记录firstsecond的值,以检查该假设:

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;
}