https://www.codewars.com/kata/is-my-friend-cheating/train/javascript
我的目标是设计一个函数,找到满足方程a * b == sum(1, 2, 3 ..., n-2, n-1, n) - a - b
的数字对 (a, b)
。下面的代码可以找到所有数字对,但速度太慢并且会超时。我在这个挑战的评论中看到算法需要具有 O(n) 复杂度才能通过。如何做到这一点?function removeNb (n) {
if(n===1) return null;
let sum = (n * (n+1))/2;
let retArr = [];
let a = n;
while( a !== 0){
let b = n;
while( b !== 0){
if(b != a && a*b == ((sum - b) - a) ){
retArr.push([a,b]);
}
b--;
}
a--;
}
retArr.sort( (a,b) => a[0] - b[0]);
return retArr;
}
感谢所有人的帮助!这是我的最终解决方案:
function removeNb (n) {
let retArr = [];
let a = 1;
let b = 0;
let sumN = (n * (n+1))/2;
while( a <= n){
b = parseInt((sumN - a) / (a + 1));
if( b < n && a*b == ((sumN - b) - a) )
retArr.push([a,b]);
a++;
}
return retArr;
}
我认为我的主要问题是在尝试解决b
时,我的代数出现了(令人尴尬的)错误。以下是适用于任何人的正确步骤:
a*b = sum(1 to n) - a - b
ab + b = sumN - a
b(a + 1) = sumN - a
b = (sumN - a) / (a + 1)