我正在尝试解决所有有关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.
答案 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
生活常识:
https://app.codility.com/demo/results/trainingEXWWGY-UUR/
为了完整起见,代码在这里。
https://github.com/niall-oc/things/blob/master/codility/ladder.py