BIÊN TẬP::
Này, hóa ra có quá nhiều lần lặp lại xảy ra. Không có vòng lặp, không phân nhánh.
Vẫn hoạt động với n âm cho phép quay phải và n dương cho phép quay trái cho bất kỳ kích thước n nào, Không có đột biến
function rotate(A,n,l=A.length) {
const offset = (((n % l) + l) %l)
return A.slice(offset).concat(A.slice(0,offset))
}
Đây là phiên bản chơi gôn mã cho tiếng cười khúc khích
const r = (A,n,l=A.length,i=((n%l)+l)%l)=>A.slice(i).concat(A.slice(0,i))
EDIT1 :: *
Thực hiện không nhánh, không đột biến.
Vậy này, hóa ra tôi đã có một chi nhánh mà tôi không cần nó. Đây là một giải pháp làm việc. âm num = xoay phải bởi | num | num dương = xoay trái theo num
function r(A,n,l=A.length) {
return A.map((x,i,a) => A[(((n+i)%l) + l) % l])
}
Phương trình ((n%l) + l) % l
ánh xạ chính xác các số dương và số âm của bất kỳ giá trị lớn nào tùy ý của n
NGUYÊN
Xoay trái và phải. Xoay trái với tích cực n
, xoay phải với tiêu cực n
.
Hoạt động cho các đầu vào lớn một cách khiêu dâm của n
.
Không có chế độ đột biến. Quá nhiều đột biến trong những câu trả lời này.
Ngoài ra, ít thao tác hơn hầu hết các câu trả lời. Không bật, không đẩy, không mối nối, không dịch chuyể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]
})
}
hoặc là
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])
})
Giải trình:
ánh xạ từng chỉ mục của A với giá trị tại độ lệch chỉ mục. Trong trường hợp này
offset = num
nếu offset < 0
sau đó offset + index + positive length of A
sẽ trỏ đến phần bù nghịch đảo.
nếu offset > 0 and offset < length of A
sau đó chỉ cần ánh xạ chỉ mục hiện tại với chỉ số bù của A.
Nếu không, hãy điều chỉnh độ lệch và độ dài để ánh xạ độ lệch trong các giới hạn của mảng.
Lấy ví dụ offset = 4
và offset = -4
.
Khi nào offset = -4
, và A = [1,2,3,4,5]
, đối với mỗi chỉ mục, offset + index
sẽ làm cho độ lớn (hoặc Math.abs(offset)
) nhỏ hơn.
Hãy giải thích phép tính cho chỉ số của n âm trước. A[(((n % A.length) + A.length) % A.length)+0]
và bị đe dọa. Đừng như vậy. Tôi mất 3 phút trong Repl để giải quyết nó.
- Chúng tôi biết
n
là tiêu cực bởi vì trường hợp là n < 0
. Nếu số lớn hơn phạm vi của Mảng, n % A.length
sẽ ánh xạ nó vào phạm vi.
n + A.length
cộng số đó A.length
để bù lại số tiền đúng.
- Chúng tôi biết
n
là tiêu cực bởi vì trường hợp là n < 0
. n + A.length
cộng số đó A.length
để bù lại số tiền đúng.
Tiếp theo Ánh xạ nó đến phạm vi độ dài của A bằng cách sử dụng modulo. Điều chỉnh thứ hai là cần thiết để ánh xạ kết quả của phép tính thành một phạm vi có thể lập chỉ mục
Chỉ số đầu tiên: -4 + 0 = -4. A.length = 5. A.length - 4 = 1. A 2 là 2. Chỉ số ánh xạ từ 0 đến 2.[2,... ]
- Chỉ số tiếp theo, -4 + 1 = -3. 5 + -3 = 2. A 2 là 3. Chỉ số bản đồ từ 1 đến 3.
[2,3... ]
- Vân vân.
Quy trình tương tự áp dụng cho offset = 4
. Khi nào offset = -4
, và A = [1,2,3,4,5]
, đối với mỗi chỉ số, offset + index
sẽ làm cho độ lớn lớn hơn.
4 + 0 = 0
. Ánh xạ A [0] với giá trị tại A [4].[5...]
4 + 1 = 5
, 5 nằm ngoài giới hạn khi lập chỉ mục, vì vậy ánh xạ A 2 với giá trị ở phần còn lại của 5 / 5
, là 0. A 2 = giá trị tại A [0].[5,1...]
- nói lại.
months[new Date().getMonth()]
để lấy tên của tháng hiện tại?