Javascript 可数不可分余度问题的求解

Javascript 可数不可分余度问题的求解,javascript,performance,logarithm,Javascript,Performance,Logarithm,我在讨论可分性问题,我在讨论“可数不可分”问题。我试过它的工作方式,但一点效率都没有 我发现答案没有任何解释,所以如果有人能花点时间,带我看完这个答案,我将不胜感激 function solution(A) { const lenOfA = A.length const counters = Array(lenOfA*2 + 1).fill(0) for(let j = 0; j<lenOfA; j++) counters[A[j]]++; ret

我在讨论可分性问题,我在讨论“可数不可分”问题。我试过它的工作方式,但一点效率都没有

我发现答案没有任何解释,所以如果有人能花点时间,带我看完这个答案,我将不胜感激

function solution(A) {
    const lenOfA = A.length
    const counters = Array(lenOfA*2 + 1).fill(0)
    for(let j = 0; j<lenOfA; j++) counters[A[j]]++;
    
    return A.map(number=> {
        let nonDivisor = lenOfA
        for(let i = 1; i*i <= number; i++) {
            if(number % i !== 0) continue;
            nonDivisor -= counters[i];
            if(i*i !== number) nonDivisor -= counters[number/i]
        }
        return nonDivisor
    })
}
编写一个函数:

function solution(A);
给定一个由N个整数组成的数组A,返回一个 表示非除数数量的整数

结果数组应作为整数数组返回

例如,假设: A[0]=3 A[1]=1 A[2]=2 A[3]=3 A[4]=6

函数应该返回[2,4,3,2,0],如上所述

为以下假设编写有效的算法:

    N is an integer within the range [1..50,000];
    each element of array A is an integer within the range [1..2 * N].

以下是我可以解释上述解决方案的方法

根据质询描述,它表示数组的每个元素都在范围[1…2*N]内,其中N是数组的长度;这意味着数组中的任何元素都不能大于2*N

因此,创建了一个长度为2*N+1(最大索引等于数组中的最大可能值)的计数器数组,其中的每个元素都初始化为0,但给定数组中实际存在的元素除外,这些元素都设置为1

现在我们要遍历给定数组中的所有元素,假设每个数字都是非除数,然后用计数器数组中的除数减去假定的非除数,这将得到实际的非除数。在循环过程中,当数组中不存在的元素是一个除数时,0被减去(记住我们的初始化值),当我们遇到同样在数组中的除数时,我们减去1(记住我们的初始化值)。这是对数组中的每个元素执行的,以获得它们的每个非分频器计数

您发布的解决方案使用了map,这只是一种转换数组的简洁方法。也可以使用简单的for循环,这样更容易理解。这是上述解决方案的一个for循环变体

  function solution(A) {
    const lenOfA = A.length
    const counters = Array(lenOfA*2 + 1).fill(0)
    for(let i = 0; i<lenOfA; i++) counters[A[i]]++;

    const arrayOfNondivisors = [];

    for(let i = 0; i < A.length; i++) {
      let nonDivisor = lenOfA
        for(let j = 1; j*j <= A[i]; j++) {
            if(A[i] % j !== 0) continue;
            nonDivisor -= counters[j];
            if(j*j !== A[i]) nonDivisor -= counters[A[i]/j]
        }
        arrayOfNondivisors.push(nonDivisor);
    }
    
    return arrayOfNondivisors;
}
函数解决方案(A){
常数lenOfA=A.长度
常量计数器=数组(lenOfA*2+1)。填充(0)
for(设i=0;i
  function solution(A) {
    const lenOfA = A.length
    const counters = Array(lenOfA*2 + 1).fill(0)
    for(let i = 0; i<lenOfA; i++) counters[A[i]]++;

    const arrayOfNondivisors = [];

    for(let i = 0; i < A.length; i++) {
      let nonDivisor = lenOfA
        for(let j = 1; j*j <= A[i]; j++) {
            if(A[i] % j !== 0) continue;
            nonDivisor -= counters[j];
            if(j*j !== A[i]) nonDivisor -= counters[A[i]/j]
        }
        arrayOfNondivisors.push(nonDivisor);
    }
    
    return arrayOfNondivisors;
}