繁体   English   中英

JS - 涉及烫发检查的编码课程

[英]JS - Lesson on codility involving perm check

我正在研究本课的解决方案:

https://app.codility.com/programmers/lessons/4-counting_elements/perm_check/

我领导了这个解决方案,使我成为了 github 用户。 https://github.com/daraosn/codility/tree/master/02-CountingElements/02-PermCheck/javascript

我确实理解了以下代码的所有内容:

function solution(A) {
        var N = A.length;
        var sum = (N * (N+1)) / 2;
        var tap = [];
        for (var i in A) {
            sum-=A[i];
            if(tap[A[i]]) {
                return 0;
            }
            tap[A[i]] = true;
        }
        return +(sum==0);
    }

除了下面的这些代码行:

if(tap[A[i]]) {
  return 0;
}
tap[A[i]] = true;

它的目的是什么? 我不明白。 我做了一个测试,从 codility 界面的答案中删除这些代码行,当我有这些行时,它返回了 75% 而不是 100%

该部分检查之前是否已找到要迭代的数字,并且根据说明,禁止重复:

置换是包含从 1 到 N 的每个元素一次且仅一次的序列。

在每次正常迭代中,当前迭代的数字被分配给tap一个属性:

tap[A[i]] = true;

然后,在后续迭代中,该测试检查是否已使用迭代的数字:

if(tap[A[i]]) {
  return 0;
}

这有助于使[2, 2, 2]类的输入无效,同时允许[1, 2, 3]

也就是说,这有两个主要的危险信号。 首先, for..in 不应该用于迭代数组 反而:

for (const num of A) {
  // use num
}

此外,稀疏数组是一个非常糟糕的主意 - 使用对象会更有意义:

var tap = {};

或一组:

var tap = new Set();
for (const num of A) {
  sum -= num;
  if (tap.has(num)) {
    return 0;
  }
  tap.add(num);
}
return +(sum == 0);

阵列解决方案不是上面解释的那么正确的方法。 但我会提出解决方案(O(n)),以防万一:)

const solution = A => ~~(A.sort((a,b) => a-b).every((a,i) => a === i+1));

 function solution(A) { const set = new Set(A) const max = Math.max(...A) return set.size === max && set.size === A.length ? 1:0 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM