แก้ไข ::
เฮ้ปรากฎว่ามีการทำซ้ำมากเกินไป ไม่มีลูปไม่แตกแขนง
ยังคงใช้งานได้กับ n ลบสำหรับการหมุนขวาและ n บวกสำหรับการหมุนซ้ายสำหรับ n ทุกขนาดโดยไม่มีการกลายพันธุ์
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))
แก้ไข 1 :: *
การใช้งานแบบไม่มีสาขาและไม่มีการกลายพันธุ์
เดี๋ยวก่อนปรากฎว่าฉันมีสาขาที่ฉันไม่ต้องการมัน นี่คือวิธีแก้ปัญหาที่ใช้งานได้ จำนวนลบ = หมุนขวาโดย | 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]
และถูกข่มขู่ อย่าเป็น ฉันใช้เวลา 3 นาทีในการเล่นซ้ำเพื่อให้ได้ผล
- เรารู้ว่าเป็นลบเนื่องจากกรณีที่เป็น
n
n < 0
หากตัวเลขมีขนาดใหญ่กว่าช่วงของ Array n % A.length
จะแมปลงในช่วง
n + A.length
เพิ่มตัวเลขนั้นA.length
เพื่อหักล้าง n จำนวนเงินที่ถูกต้อง
- เรารู้ว่าเป็นลบเนื่องจากกรณีที่เป็น
n
เพิ่มตัวเลขนั้นเพื่อหักล้าง n จำนวนเงินที่ถูกต้องn < 0
n + A.length
A.length
ถัดไปแมปกับช่วงของความยาวของ 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()]
เพื่อรับชื่อของเดือนปัจจุบัน?