Given an array, rotate the array to the right by k steps, where k is non-negative.
Follow up:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
Could you do it in-place with O(1) extra space?
배열의 오른쪽으로 k 단계 씩 회전 합니다. (k는 음수가 아닙니다.)
문제를 해결하는 방법이 적어도 3가지 있으니 여러가지 방벅으로 풀어보라고 한다. ^^;;
Input: nums = [1,2,3,4,5,6,7], k = 3
Output: [5,6,7,1,2,3,4]
Explanation:
rotate 1 steps to the right: [7,1,2,3,4,5,6]
rotate 2 steps to the right: [6,7,1,2,3,4,5]
rotate 3 steps to the right: [5,6,7,1,2,3,4]
배열의 메소드를 가지고 풀어봤다.
1. nums 배열의 전체 진행을 위해 k 만큼 반복 루프를 돌린다.
1. 마지막 값을 첫번째 index에 추가해준다.
2. 마지막 index를 삭제해준다.
/**
* @param {number[]} nums
* @param {number} k
* @return {void} Do not return anything, modify nums in-place instead.
*/
var rotate = function(nums, k) {
//배열 끝에서 부터 k만큼의 인덱스를 배열 첫번째로 넣는다.
//k만큼 배열의 끝번째 값을 첫번째에 넣는다.
for(let i=1; i<=k; i++) {
nums.unshift(nums[nums.length-1]);
nums.pop();
}
//return nums;
};
위 식으로 진행하면 runtime도 길게 나오고 메모리도 좀 많이 잡아 먹는걸 확인할 수 있다.
배열의 끝에서 k 만큼 통으로 잘라서 ...로 문자열화 시켜주고 배열 앞에 넣어줬다.
이렇게 해주니 반복루프 돌면서 배열의 끝 값을 하나씩 앞에 추가하고, 끝값을 삭제해줬던 식보다 속도가 확실히 빨라졌다.
var rotate = function(nums, k) {
nums.unshift(...(nums.splice(nums.length-k, k)))
};