Codility Ladder javascript-无法理解使答案从37%跃升至100%的细节

时间:2018-07-30 19:12:58

标签: javascript algorithm

我正在尝试解决所有有关Codility的课程,但未能解决以下问题:Ladder by codility

我已经在互联网上进行了搜索,但找不到一个令我满意的答案,因为没有人回答为什么max变量对结果如此重要的影响。

因此,在发布代码之前,我将解释这种想法。

通过查看它,我并不需要太多时间来了解它的组合总数是斐波那契数,并且从斐波那契数组中删除0,我会很快找到答案。

现在,他们之后告诉我们,应该返回组合模数2 ^ B [i]的数量。

到目前为止,我非常满意,因此我决定不使用var max提交它,然后我得到了37%的分数。我在互联网上进行了搜索,结果100%与我的相似,但是他们添加了max = Math.pow(2,30)。

任何人都可以向我解释最高分数如何以及为何如此影响分数吗?

我的代码:

// Powers 2 to num
function pow(num){
    return Math.pow(2,num);
}
// Returns a array with all fibonacci numbers except for 0
function fibArray(num){
    // const max = pow(30); -> Adding this max to the fibonaccy array makes the answer be 100% 
    const arr = [0,1,1];
    let current = 2;

    while(current<=num){
        current++;
        // next = arr[current-1]+arr[current-2] % max; 
        next = arr[current-1]+arr[current-2]; // Without this max it's 30 %
        arr.push(next);
    }

    arr.shift(); // remove 0
    return arr;

}

function solution(A, B) {
    let f = fibArray(A.length  + 1);
    let res = new Array(A.length);

    for (let i = 0; i < A.length; ++i) {
        res[i] = f[A[i]] % (pow(B[i]));
    }

    return res;
}

console.log(solution([4,4,5,5,1],[3,2,4,3,1])); //5,1,8,0,1 

// Note that the console.log wont differ in this solution having max set or not.
// Running the exercise on Codility shows the full log with all details 
// of where it passed and where it failed.

2 个答案:

答案 0 :(得分:4)

输入参数的限制为:

  

假设:

     
      
  • L是[1..50,000]范围内的整数;
  •   
  • 数组A的每个元素都是[1..L]范围内的整数;
  •   
  • 数组B的每个元素都是[1..30]范围内的整数。
  •   

因此f中的数组fibArray的长度可以为50,001。

斐波纳契数呈指数增长;根据{{​​3}},第50,000个Fib号码具有10,000多个数字。

JavaScript没有对任意精度整数的内置支持,甚至双精度也只能提供〜14s.f。的精度。因此,使用修改后的代码,您将获得L的任何重要值的“垃圾”值。这就是为什么您只有30%的原因。

但是为什么max是必需的?模数学告诉我们:

(a + b) % c = ([a % c] + [b % c]) % c

因此,通过将% max应用于迭代计算步骤arr[current-1] + arr[current-2]fibArray中的每个元素都将成为其对应的Fib编号mod max没有任何变量超出 max(或内置整数类型)随时的值

fibArray[2] = (fibArray[1] + fibArray[0]) % max = (F1 + F0) % max = F2 % max
fibArray[3] = (F2 % max + F1) % max             = (F2 + F1) % max = F3 % max
fibArray[4] = (F3 % max + F2 % max)             = (F3 + F2) % max = F4 % max
and so on ...
(Fn is the n-th Fib number)

请注意,由于B[i]永远不会超过30,pow(2, B[i]) <= max;因此,由于max总是可被pow(2, B[i])整除,因此应用% max不会影响最终结果。

答案 1 :(得分:0)

这是一个python 100%的答案,我希望提供一个解释:-)

简而言之;模数%对于某些数字类似于“按位与”和&。 例如,任何数字%10都等于最右边的数字。

284%10 = 4
1994%10 = 4

生活常识:

  1. 对于2的倍数-> X%Y等于X&(Y-1)
  2. 当在本课程中将超大数组作为args给出时,
  3. 针对range(1,31)中的i的预计算(2 ** i)-1比计算B中的所有内容都要快。
  4. 因此,fib(A [i])和pb [B [i]]的计算比X%Y样式的东西要快。

https://app.codility.com/demo/results/trainingEXWWGY-UUR/

为了完整起见,代码在这里。

https://github.com/niall-oc/things/blob/master/codility/ladder.py