将索引镜像到数组

时间:2019-02-01 19:59:21

标签: algorithm

假设我有n个数组。现在,当获得索引i时,该索引i可以在[-n; 2n-1]我要按如下所示索引到数组中

enter image description here 箭头指示如果我低于0(黄色)或高于n-1(蓝色)应该返回哪个元素

3 个答案:

答案 0 :(得分:1)

让我们假设您的可能值数组的长度为n(在我们的情况下[0,1,2,3,4]的长度为5)。镜子的整个长度将为2n-1:

possibleValues = [4, 3, 2, 1, 0, 1, 2, 3, 4]

现在,假设索引0处的值数组位于镜像(0)的中间,则必须使用公式算术运算

result[v] = possibleValues[((v + n - 1) % 2n - 1)]

现在,由于您的实际数组看起来像[0,1,2,3,4],因此您需要将可能值使用的索引转换为对您的实际数组更有用的内容:

possibleIndex = ((v + n - 1) % 2n - 1)
if (possibleIndex >= n) actualIndex = possibleIndex - n + 1
else possibleIndex = actualIndex = n = possibleIndex

答案 1 :(得分:0)

function mirrorArr(arr) {
    let newArr = [];
    newArr.length = arr.length * 3;

    for(let i = 0; i < arr.length; i++) {
        newArr[-arr[i]-1] = arr[i];
        newArr[i] = arr[i];
        newArr[i+arr.length] = arr.length-i-1;
    }
    return newArr;
}
let arr = [0, 1, 2, 3, 4];
let mirroredArr = mirrorArr(arr);
console.log(mirroredArr[-5]);

类似这样的技巧

答案 2 :(得分:0)

为达到预期效果,请使用以下使用扩展运算符和反向数组方法的选项

var arrOne = [0,1,2,3,4];
var result = []
var revArr = [...arrOne].reverse()
result = [...revArr,...arrOne, ...revArr]

console.log(result)