Я пытаюсь решить все уроки по кодовости, но я не сделал этого по следующей проблеме: Лестница от кодовости
Я искал по всему Интернету, и я не нахожу ответа, который удовлетворяет меня, потому что никто не отвечает, почему максимальная переменная так сильно влияет на результат.
Поэтому, прежде чем публиковать код, я объясню мышление.
Посмотрев на это, мне не нужно было много времени, чтобы понять, что общее количество комбинаций это число Фибоначчи и удаление 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.
Пределы для входных параметров:
Предположим, что:
- 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
не влияет на конечный результат.
B[i]
и max
была для вас интуитивной; лучший способ объяснить это состоит в том, что % pow(2, i)
эквивалентно извлечению первых i
битов в двоичном образце. Таким образом, % max
, который извлекает 30 бит, не влияет на конечный результат, поскольку % pow(2, B[i])
также извлекает не более 30 бит.