可以了,谢谢,只是有点伤感。
背景
假设有这样一个数组 [1,2,3,4,5] 现在想要左移或者右移N位,比如移动1位 //左移1位 [2,3,4,5,1] //右移1位 [5,1,2,3,4]
简单的考虑
- 把数组 arr 看成循环数组
- 正确处理数组 range{0, arr.length} 外的索引
1 | //- 通过 from_index 和 max_index 来计算出移动后位置对应的初始位置, |
以下为输出结果
简写
有没有形式上更简单的实现方式呢?毕竟写两个函数实在太 "nodejs" 了, 我们注意到Array.prototype.slice
这个方法的两个参数begin
和end
都支持负整数.
A negative index can be used, indicating an offset from the end of the sequence. slice(-2) extracts the last two elements in the sequence.对于 end 而言负值的 index 表示从序列的末尾开始计算的偏移量.
slice(-2)
会截取出在序列的最后两个元素.
A negative index can be used, indicating an offset from the end of the sequence. slice(2,-1) extracts the third element through the second-to-last element in the sequence.负值的 index 表示从序列的末尾开始计算的偏移量.
slice(2, -1)
会截取出序列的 [2, ARR_LEN - 1) 子序列
这意味着我们上述考虑中对from_pos
的调用可以发生一些变化.
只考虑 n 为正整数的情况, 则有
list.slice(-n)
取数组后 n 个元素组成的序列list.slice(0, -n)
取数组 [0, list.length-n) 子序列 subseq2subseq2.concat(subseq1)
即为结果数组
n 为负整数的情况可转化为 n 为正整数的情况
n 为 0, 则不必位移
1 | function leftDisplacement (list, n = 0) { |
进一步简化一下, 写出一行流
1 | function leftDisplacement (list, n = 0) { |