3
votes

Faire pivoter un tableau à partir de la position centrale

J'essaie de faire pivoter un tableau à partir de la position centrale. Dites par exemple:

Pour un tableau [1,2,3,4,5] si je sélectionne 5 comme élément actuel, le nouveau tableau doit être [3,4,5,1,2] . Si je sélectionne 4 , cela devrait être [2,3,4,5,1

J'ai essayé le code ci-dessous et cela fonctionne pour certains étendue mais il positionne le sélectionné au début au lieu du centre.

Toute aide à l'approche sera vraiment appréciée

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))


5 commentaires

Pourquoi 2 apparaît deux fois dans la deuxième sortie?


Que faire s'il y a un nombre pair d'éléments dans le tableau?


Le deuxième argument est index ou valeur?


@VDWWD mon exigence est uniquement pour un nombre impair d'articles


@NathanXabedi c'est la valeur


3 Réponses :


2
votes

Premièrement, trouvez dans quelle mesure vous allez faire pivoter le tableau ( delta ), puis vous épissez autant d'éléments que sa magnitude à partir de l'avant si elle est négative ou de l'arrière si elle est positive. Placez les éléments épissés à l'extrémité opposée.

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))


0 commentaires

2
votes

c'est fondamentalement la même chose que ce que @Mohammad a publié, mais au lieu d'utiliser ind comme index, vous utilisez arr.indexOf (ind) pour obtenir l'index pertinent.

J'ajouterais aussi quelque chose pour traiter le si vous ne trouvez pas la valeur ...

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));

Modifier: modifié pour gérer le décalage depuis la fin ou le début


0 commentaires

4
votes

Essayez

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) );

n | 0 transforme le flottant en entier. Nous utilisons la fonction de flèche , indexOf et carte

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


1 commentaires

Ne devrait-il pas être a.map (/ * ... * /) au lieu de arr.map (/ * ... * /) ?