편집하다::
이봐 그래서 너무 많은 반복이 일어나고 있음이 밝혀졌습니다. 루프도, 분기도 없습니다.
오른쪽 회전의 경우 음수 n으로, 모든 크기 n의 경우 왼쪽 회전의 경우 양수 n으로 작동합니다. Mutation free
function rotate(A,n,l=A.length) {
const offset = (((n % l) + l) %l)
return A.slice(offset).concat(A.slice(0,offset))
}
킥킥 웃음을위한 코드 골프 버전입니다.
const r = (A,n,l=A.length,i=((n%l)+l)%l)=>A.slice(i).concat(A.slice(0,i))
EDIT1 :: *
분기없는, 돌연변이없는 구현.
그래서 이봐, 내가 필요하지 않은 지점이 있었음이 밝혀졌습니다. 다음은 작동하는 솔루션입니다. 음수 num = 오른쪽 회전 | num | 양수 num = 왼쪽 회전 num
function r(A,n,l=A.length) {
return A.map((x,i,a) => A[(((n+i)%l) + l) % l])
}
방정식 ((n%l) + l) % l
은 임의적으로 큰 n 값의 양수와 음수를 정확하게 매핑합니다.
실물
좌우로 회전합니다. 양수로 왼쪽으로 n
회전하고 음수로 오른쪽으로 회전 n
합니다.
의 음란 큰 입력을위한 작품 n
.
돌연변이 모드가 없습니다. 이 답변에 너무 많은 돌연변이가 있습니다.
또한 대부분의 답변보다 작업 수가 적습니다. 팝, 밀기, 스플 라이스, 시프트 없음.
const rotate = (A, num ) => {
return A.map((x,i,a) => {
const n = num + i
return n < 0
? A[(((n % A.length) + A.length) % A.length)]
: n < A.length
? A[n]
: A[n % A.length]
})
}
또는
const rotate = (A, num) => A.map((x,i,a, n = num + i) =>
n < 0
? A[(((n % A.length) + A.length) % A.length)]
: n < A.length
? A[n]
: A[n % A.length])
rotate([...Array(5000).keys()],4101)
rotate([...Array(5000).keys()],-4101000)
[...Array(5000).keys()].forEach((x,i,a) => {
console.log(rotate(a,-i)[0])
})
[...Array(5000).keys()].forEach((x,i,a) => {
console.log(rotate(a,i*2)[0])
})
설명:
A의 각 인덱스를 인덱스 오프셋의 값에 매핑합니다. 이 경우
offset = num
이 경우 offset < 0
다음 offset + index + positive length of A
오프셋 역 가리킬 것이다.
그렇다면 offset > 0 and offset < length of A
현재 인덱스를 A의 오프셋 인덱스에 매핑하면됩니다.
그렇지 않으면 오프셋과 길이를 모듈로하여 배열 경계의 오프셋을 매핑합니다.
예를 들어 가지고 offset = 4
와 offset = -4
.
때 offset = -4
, 그리고 A = [1,2,3,4,5]
각 인덱스, offset + index
크기 (또는 것 Math.abs(offset)
) 작은합니다.
먼저 음수 n의 인덱스 계산을 설명해 봅시다. A[(((n % A.length) + A.length) % A.length)+0]
겁을 먹었습니다. 그러지 마. 그것을 해결하는 데 Repl에서 3 분이 걸렸습니다.
n
케이스가이므로 부정적이라는 것을 알고 n < 0
있습니다. 숫자가 배열의 범위보다 크면 범위에 n % A.length
매핑합니다.
n + A.length
그 숫자를 A.length
에 추가 하여 n을 정확한 양으로 오프셋하십시오.
n
케이스가이므로 부정적이라는 것을 알고 n < 0
있습니다. n + A.length
그 숫자를 A.length
에 추가 하여 n을 정확한 양으로 오프셋하십시오.
다음으로 모듈로를 사용하여 A의 길이 범위에 매핑합니다. 두 번째 모듈은 계산 결과를 색인 가능한 범위에 매핑하는 데 필요합니다.
첫 번째 색인 : -4 + 0 = -4. A.length = 5. A.length-4 = 1. A 2 는 2 입니다. 인덱스 0을 2로 매핑합니다.[2,... ]
- 다음 인덱스, -4 + 1 = -3. 5 + -3 = 2. A 2 는 3입니다. 인덱스 1을 3으로 매핑합니다.
[2,3... ]
- 기타.
동일한 프로세스가 offset = 4
. 때 offset = -4
, 그리고 A = [1,2,3,4,5]
각 인덱스, offset + index
크기가 큰 것.
4 + 0 = 0
. A [0]을 A [4]의 값에 매핑합니다.[5...]
4 + 1 = 5
, 5는 인덱싱 할 때 범위를 벗어 났으므로 A 2 를의 나머지 값인 5 / 5
0에 매핑 합니다. A 2 = A [0]의 값입니다.[5,1...]
- 반복.
months[new Date().getMonth()]
이달의 이름을 얻기 위해 사용 하는 것이 어떻습니까?