编辑::
嘿,结果是迭代太多了。没有循环,没有分支。
对于任何大小的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))
EDIT1 :: *无分支
,无变异的实现。
所以,嘿,原来我有一个我不需要的分支。这是一个可行的解决方案。负数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]
被吓倒了 不用了 我花了3分钟在一个Repl上解决它。
- 我们知道
n
是负面的,因为情况是这样n < 0
。如果该数字大于Array的范围,n % A.length
则将其映射到该范围。
n + A.length
将该数字加到A.length
以抵消n的正确数量。
- 我们知道
n
是负面的,因为情况是这样n < 0
。n + A.length
将该数字加到A.length
以抵消n的正确数量。
Next使用模将其映射到A的长度范围。第二模数是将计算结果映射到可索引范围所必需的
第一个索引:-4 + 0 = -4。则为a.length = 5则为a.length - 4 = 1,一种2是2地图索引0至2。[2,... ]
- 下一个索引-4 + 1 = -3。5 + -3 = 2,一种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()]
获取当前月份的名称?