我正在尝试解决this problem的协调性。我的解决方案通过了所有测试,除了其中一个测试以空数组和旋转1作为参数。我迷失了如何甚至解决这个问题的方法。有人可以向正确的方向推我吗?除了为空数组检查编写特定的if
子句外。我无法提出一个更优雅的解决方案。
function solution(A, K)
{
for (i=0; i<K; i++)
{
A.unshift(A.pop());
}
return A;
}
答案 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);
您可以在执行以下操作之前使函数可视化(对于我们的示例,使函数solution
为f
)
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)
}