从中心位置旋转数组

3

我正在尝试从中心位置旋转数组。比如说:

对于一个数组[1,2,3,4,5],如果我选择5作为当前元素,则新数组应该是[3,4,5,1,2]。 如果我选择4,那么它应该是[2,3,4,5,1]

我尝试了下面的代码,它在某种程度上起作用,但它将选定的元素放在开头而不是中心。

任何关于这个方法的帮助将非常感激。

var arr = [0,1,2,3,4];
function rot(arr, ind)
{
    var narr = [];
        var len = arr.length;
        for(var i=0; i<arr.length; i++)
        {
            narr.push((i+ind<len?arr[i+ind]:arr[len-i-1]));
        }
    return narr;
}
console.log(rot(arr,0))

为什么第二个输出中2出现了两次? - Maheer Ali
如果数组中的项数是偶数怎么办? - VDWWD
第二个参数是索引还是值? - Nathan Xabedi
@VDWWD 我的要求只针对奇数项。 - Biky
@NathanXabedi 这是值。 - Biky
3个回答

4

尝试

let rot= (a,v,i=a.indexOf(v)) => a.map((x,j)=> a[(i+1+j+a.length/2)%a.length|0])

n|0 将浮点数转换成整数。我们使用箭头函数indexOfmap

let arr=[1,2,3,4,5];

let rot=(a,v,i=a.indexOf(v))=>a.map((x,j)=>a[(i+1+j+a.length/2)%a.length|0]);
 
console.log( rot(arr,4) ); 
console.log( rot(arr,5) );


应该使用 a.map(/* ... */), 而不是 arr.map(/* ... */) 吗? - Nathan Xabedi

2
首先,找出您需要旋转的数组程度(delta),然后根据它的大小从前面(如果是负数)或后面(如果是正数)切下同样数量的项。 将切下的项放在相反的端点上。"最初的回答"

function rot(arr, center) {
  const index = arr.indexOf(center)
  if (index === -1) {
    throw new Error('')
  }
  if (arr.length % 2 === 0) {
    throw new Error('')
  }
  const cIndex = Math.floor(arr.length/2)
  const delta = cIndex - index
  let narr = [...arr]
  if (delta > 0) {
    let temp = narr.splice(-delta)
    narr = [...temp, ...narr]
  }
  else if (delta < 0) {
    let temp = narr.splice(0, -delta)
    narr = [...narr, ...temp]
  }
  return narr
}

let arr = [1,2,3,4,5]
console.log(rot(arr, 1))
console.log(rot(arr, 2))
console.log(rot(arr, 3))
console.log(rot(arr, 4))
console.log(rot(arr, 5))


2
这基本上与@Mohammad发布的内容相同,但是使用arr.indexOf(ind)而不是使用ind作为索引来获取相关索引。 我还要加上一些处理找不到值的情况的内容...

let arrr = [1,2,3,4,5];
function rot(arr, ind) {
    let narr = [...arr]; //copy and de-reference our array
    let indexFound = narr.indexOf(ind); //find out where ind is
    if(indexFound < 0 ) return narr; //ind was not found in your array
    let len = Math.floor((narr.length/2) - indexFound); //find out how far your target is from the center
    let doShift  = (len < 0); //if len is negative, then we need elements from the beginning moved, otherwise move the elements off the end with pop()
    len = Math.abs(len); //make sure len is always positive so our loop can run
   for(var i=0; i<len; i++) {
      if(doShift) narr.push(narr.shift());
        else narr.unshift(narr.pop());
    }
    return narr;
}

console.log(rot(arrr,3));
console.log(rot(arrr,1));
console.log(rot(arrr,5));

编辑:修改以处理从开头或结尾的移位

最初的回答


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接