Javascript Codility Ladder - непонимание детали, которая скачет ответ с 37 до 100%

1

Я пытаюсь решить все уроки по кодовости, но я не сделал этого по следующей проблеме: Лестница от кодовости

Я искал по всему Интернету, и я не нахожу ответа, который удовлетворяет меня, потому что никто не отвечает, почему максимальная переменная так сильно влияет на результат.

Поэтому, прежде чем публиковать код, я объясню мышление.

Посмотрев на это, мне не нужно было много времени, чтобы понять, что общее количество комбинаций это число Фибоначчи и удаление 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 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.
  • 1
    @meowgoesthedog исправлено
  • 1
    @mplungjan добавил журнал консоли и прокомментировал после
Показать ещё 2 комментария
Теги:
algorithm

1 ответ

3
Лучший ответ

Пределы для входных параметров:

Предположим, что:

  • L представляет собой целое число в пределах диапазона [1,50,000];
  • каждый элемент массива A является целым числом в пределах диапазона [1..L];
  • каждый элемент массива B является целым числом в диапазоне [1..30].

Таким образом, массив f в fibArray может иметь длину 50,001.

Числа Фибоначчи растут экспоненциально; согласно этой странице, 50 000-й номер Fib имеет более 10 000 цифр.

Javascript не имеет встроенной поддержки для произвольных целых чисел точности, и даже удваивает только предложение ~ 14 sf точности. Таким образом, с измененным кодом вы получите значения "мусора" для любого значимого значения 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
    @pihh спасибо. Надеюсь, последняя часть о B[i] и max была для вас интуитивной; лучший способ объяснить это состоит в том, что % pow(2, i) эквивалентно извлечению первых i битов в двоичном образце. Таким образом, % max , который извлекает 30 бит, не влияет на конечный результат, поскольку % pow(2, B[i]) также извлекает не более 30 бит.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню