
[英]MaxCounters (lesson 4 in codility) - 100% correctness but 60% on efficiency, why?
[英]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.