Codility CyclicRotation Javascript解决方案:空数组返回错误

时间:2019-01-28 01:25:54

标签: javascript arrays for-loop rotation

我正在尝试解决this problem的协调性。我的解决方案通过了所有测试,除了其中一个测试以空数组和旋转1作为参数。我迷失了如何甚至解决这个问题的方法。有人可以向正确的方向推我吗?除了为空数组检查编写特定的if子句外。我无法提出一个更优雅的解决方案。

function solution(A, K)
{
    for (i=0; i<K; i++)
    {
        A.unshift(A.pop());
    }
    return A;
}

5 个答案:

答案 0 :(得分:2)

尝试一下:

let solution = (A, K) => {
    for (i=0; i<K; i++){
        A.unshift(A.pop());
    }
    return A[0] != undefined ? A : [];
}

答案 1 :(得分:1)

一种解决方案是在循环A.length部分中检查conditions

function solution(A, K)
{
    for (i = 0; i < K && A.length; i++)
    {
        A.unshift(A.pop());
    }
    return A;
}

console.log(solution([3, 8, 9, 7, 6], 3));
console.log(solution([], 5));

答案 2 :(得分:1)

解决此问题的另一种方法是通过递归。在这种情况下,可以使用if语句,但这是终止递归调用的基础。这里的基本情况是if K === 0表示如果我们不再需要旋转数组,则返回该数组。它还有另一部分,如果返回!A.length,则返回数组。这意味着,如果数组为空,则还返回当前数组。

function solution(A, K) {
  if(K === 0 || !A.length) return A;
  return solution([A.pop(), ...A], K-1);  
}

console.log(solution([1, 2, 3, 4], 2)); // [3, 4, 1, 2]
console.log(solution([], 10)); // []

如果愿意,可以将以上内容改写为单行代码:

const f = (A, K) => K === 0 || !A.length ? A : f([A.pop(), ...A], K-1);

您可以在执行以下操作之前使函数可视化(对于我们的示例,使函数solutionf

f([1, 2, 3, 4], 2) = f([4] + [1, 2, 3], 1) = f([4, 1, 2, 3], 1)

f([4, 1, 2, 3], 1) = f([3, 4, 1, 2], 0) --> [3, 4, 1, 2] // we return the array instead of another function call as K === 0 (our base case)

或者当数组为空时:

f([], 10) = [] // instantly return our array as it is empty. The clause !A.length is true (also part of our base case) which means we return A (our array) instantly.

答案 3 :(得分:0)

另一个获得100%全面回报的替代方法:

function solution(A, K) {
    const k = K % A.length; // in case the rotation is bigger than the length of the array
    if (K === 0 || k === 0) {
      return A;
    }
    const head = A.slice(0, A.length - k);
    const tail = A.slice(A.length - k, A.length);
    return [...tail, ...head];
}

答案 4 :(得分:0)

刚刚获得 100%。

function cyclicRotation(A, K){
    K = K % A.length
    let sliceA = A.slice(A.length-K, A.length)
    let sliceB = A.slice(0, A.length-K)
    return sliceA.concat(sliceB)
}