【问题标题】:Why is my JavaScript code with arrays not working?为什么我的带有数组的 JavaScript 代码不起作用?
【发布时间】:2017-11-29 18:30:06
【问题描述】:

我正在尝试解决 CodeWars Kata: Zeros and Ones。 我的代码解决了 1800 多个 Attempt 测试,但仅失败了 100 多个。 我的问题是我看不到测试数据,因为它太大了。 要查看其他 katas 中的测试数据,我可以使用 console.log 语句。 但是,这个挑战的测试数据太大了。我得到一个输入数组的第一部分的列表,然后是“和 400 多个项目”。

下面是对 kata 和我的代码的描述以及一些测试用例。 我试图创建在我的代码运行时失败的测试用例;但是,我无法创建任何失败的内容。

  • 我的逻辑合理吗?我在逻辑中遗漏了什么吗?
  • 你能提供一个会失败的测试用例吗? (这会更好地帮助我学习,因为我必须分析我的代码来修复它。)

给定一个只包含 0 和 1 的数组,求 零,如果转换为一,将使最长的序列 那些。例如,给定数组... [1,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,0,1,1], ...将零替换为 索引 10(从 0 开始计数)形成 9 个 1 的序列。你的任务是 编写函数 replaceZero() 来确定在哪里替换 0 和 1 组成最大长度的子序列。注意:如果 是多个结果,返回最后一个 [1,1,0,1,1,0,1,1] //=> 5 数组将始终包含零和一。

function replaceZero(arr){

var highestCt = 0;
var returnIdx = 0;

var onesCt = 0;
var currentHighOnesCt = 0;

function countOnes(currentIZ){ // The input should be the current index of the ZERO.
  for(var j = currentIZ - 1; j >= 0; j--){ // Go backwards until a zero is found, or to the beginning of the array.
    if(arr[j] === 1){
      onesCt = onesCt + 1;
    }
    else { // if arr[j] === 0
      break;
    }
  }
  for(var k = currentIZ + 1; k < arr.length; k++){ // Go forwards to a zero or the end of the array.
    if(arr[k] === 1){
      onesCt = onesCt + 1;
    }
    else { // if arr[k] === 0
      break;
    }
  }
  if(onesCt >= currentHighOnesCt){
    currentHighOnesCt = onesCt;
    returnIdx = currentIZ;
  }
  onesCt = 0;
}

for(var i = 0; i < arr.length - 2; i++)
  if(arr[i] === 1 && arr[i + 1] === 0 && arr[i + 2] === 1){
    countOnes(i + 1); // Send the index of the ZERO.
  }

// console.log("returnIdx: " + returnIdx);

return returnIdx;
}

/*
replaceZero([0,0,1,1,1,0,1,1,0,0,1,0]); // 5
replaceZero([0,0,0,1,1,1,0,1,1,0,0,0]); // 6
replaceZero([1,1,1,1,0,1]); // 4
*/
replaceZero([1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1]); // 9
replaceZero([1,0,0,0,1,0,1,1]); // 5

/*
replaceZero([0,0,1,1,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,0,1,1]); // 6
replaceZero([0,0,1,0,0,1,1,1,0,1,1,0,0,1,1,0,1,1,0]); // 8
replaceZero([0,0,1,0,0,1,1,0,1,1,0,0,1,1,1,0,1,1,0]); // 15
replaceZero([1,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,0,1,1]); // 10;
replaceZero([1,1,0,1,1,0,1,1]); // 5;
replaceZero([1,1,1,0,1,1,0,1,1,1]); // 6);
*/

【问题讨论】:

  • 这个问题更适合codereview.stackexchange.com
  • 我在 Code Review 上阅读了规则。它表示代码必须正常工作。我的代码不起作用。
  • 你能提供kata的链接吗?
  • 我认为这将是一个很好的练习,并对solution 采取了不同的方法它不能解决你的问题,但我想我会把我的解决方案扔在那里..

标签: javascript arrays


【解决方案1】:

好吧,我实际上并不打算重构您的代码,但这可能会对您有所帮助:

  • 为什么您认为您必须更改的Zero 位于两个Ones 之间? 您的 if 语句在这方面存在缺陷。

你的代码:

if(arr[i] === 1 && arr[i + 1] === 0 && arr[i + 2] === 1){ //WHY IN BETWEEN??
  countOnes(i + 1); // Send the index of the ZERO.
}
  • 考虑到上述情况,以下情况将失败:

代码:

replaceZero([0,0,0,0,0,0,1]); // 0
replaceZero([0,0,0,0,0,1,1]); // 0
replaceZero([0,0,0,0,1,1,1]); // 0
//.. and so on
//Also
replaceZero([1,1,1,1,1,0,0]); // 0
replaceZero([1,1,1,1,0,0,0]); // 0

如果在这种情况下对 [0,0,0,0,0,0,0] 进行了测试,请不要感到惊讶,在这种情况下,数组中的最后一个索引就是预期的答案。

【讨论】:

  • 好。谢谢。我不想让你重写它。我只想知道它在哪里失败或为什么我可以解决它。嗯。。好。我从未考虑过没有 0,1,0 序列的测试用例。但是,这从未在 kata 描述中说明。没有考虑这种可能性是我的错。我将针对这种情况重新编写我的代码并回到这篇文章。谢谢。
  • 没问题,你会遇到很多没有明确解释每个场景的katas,有时可能会很有挑战性,但我认为这些问题确实可以帮助你提高技能。如果您发现它有帮助,也不要忘记为答案投票。祝你好运!
  • 虽然我还没有解决所有问题,但您的建议使我发现了我的代码中的问题: - 有测试用例最长的字符串位于数组的末尾。此字符串比由单个零分隔的字符串的任何组合都长。 - 还有一些测试用例,其中有一串由两个或多个零包围的字符串比由单个零分隔的一串字符串的任何组合更长。我不确定在测试数组的开头是否有任何字符串,后跟两个或多个零。但是,我可能应该考虑到这一点。
  • 就在我对您的回答发表评论后,我去了 CodeWars。我试着输入这个:console.log(arr.toString());它只是希望将合并后的数组转换为字符串会显示完整的测试输入数组。当缓冲区填满时,我没有得到所有的测试用例。但是,我有很多测试用例都失败了。而且,您的建议使我在测试用例中寻找特定的东西。所以,事实上,一旦我获得允许上面列出的所有可能性的代码,你的答案最终将解决我的问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-09-28
  • 2021-09-30
  • 1970-01-01
  • 2018-12-01
  • 2016-03-02
  • 1970-01-01
  • 2014-01-23
  • 2013-08-06
相关资源
最近更新 更多