4
votes

Shift strings Circulaire gauche et droite

Sur Hackerrank, je suis tombé sur ce problème. J'ai une fonction qui prend 3 arguments. Exemple -> function shiftStrings ("string", leftShifts, rightShifts); LeftShifts et rightShifts étant des entiers.

Left Shift: Une seule rotation circulaire de la chaîne dans laquelle le premier caractère devient le dernier caractère et tous les autres caractères sont décalés d'un index vers la gauche. Par exemple, abcde devient bcdea après un décalage vers la gauche et cdeab après deux décalages vers la gauche.

Décalage vers la droite: Une seule rotation circulaire de la chaîne dans laquelle le dernier caractère devient le premier caractère et tous les autres caractères sont décalés vers la droite. Par exemple, abcde devient eabcd après un décalage vers la droite et désactivée après deux décalages vers la droite.

J'ai réussi 7 cas de test sur 13, mais les cinq autres ont expiré. Voici ma solution

function getShiftedString(s, leftShifts, rightShifts) {
// Write your code here
let arr = s.split('');

for (let i = 0; i < leftShifts; i++) {
    let arrItem = arr[0];
    arr.shift();
    arr.push(arrItem);
};

for (let i = 0; i < rightShifts; i++) {
    let arrItem = arr[arr.length - 1];
    arr.pop();
    arr.unshift(arrItem);
};

const finished = arr.join('');
return finished;

}

Des idées sur une meilleure façon de faire cela? Je suis plus nouveau en programmation et j'essaie de m'entraîner à l'algorithme.


1 commentaires

Eh bien, une optimisation est rightShifts - leftShifts , la prochaine optmisation est juste deux tranches simples, .. par exemple .. abcdef décalé vers la gauche 2 peut être cdef + ab , juste 2 tranches de chaîne simples. Oh et vous voudrez peut-être moduler les décalages, par exemple. une chaîne de longueur 5 décalée vers la gauche 6 fois équivaut au décalage vers la gauche de 1.


4 Réponses :


10
votes

Il serait probablement plus facile d'utiliser slice (qui peut accepter des indices négatifs) et de calculer le décalage net au départ, de sorte qu'une seule opération de décalage réelle doit se produire:

p >

function getShiftedString(s, leftShifts, rightShifts) {
 // using `split('')` will result in certain unicode characters being separated incorrectly
 // use Array.from instead:
  const arr = Array.from(s);
  const netLeftShifts = (leftShifts - rightShifts) % arr.length;
  return [...arr.slice(netLeftShifts), ...arr.slice(0, netLeftShifts)]
    .join('');
}

console.log([
  getShiftedString('abc', 0, 0),
  getShiftedString('abc', 1, 0),
  getShiftedString('abc', 0, 1),
  getShiftedString('abc', 1, 1),
  getShiftedString('123456789', 0, 0),
  getShiftedString('123456789', 1, 5),
  getShiftedString('123456789', 5, 1),
  '----',
  getShiftedString('123456789', 9, 0),
  getShiftedString('123456789', 10, 0),
  getShiftedString('123456789', 0, 9),
  getShiftedString('123456789', 0, 10),
  getShiftedString("🐎👱❤", 0, 0),
  getShiftedString("🐎👱❤", 1, 0),
]);


1 commentaires

Belle réponse!



0
votes

Voici ma solution pour le décalage à gauche et à droite en utilisant un opérateur d'épissage et d'étalement.

   //left
let str="abcde";
let arr=Array.from(str);
let left_shift=2;
let x=arr.splice(0, left_shift);
console.log([...arr,x].flat().join(""));

//right

let arr1=Array.from(str).reverse();
let right_shift=2;
let x1=arr1.splice(0, right_shift);
console.log([...arr1,x1].flat().reverse().join(""));


0 commentaires

0
votes

J'étudiais le même problème ... vous pouvez utiliser ce code à la place. J'ai utilisé kotlin.

fun getShiftedString(s: String, leftShifts: Int, rightShifts: Int): String {
    // Write your code here
    var result = "" ; 
    val l = s.length ;
    var d =(leftShifts-rightShifts)%l ;
    if (d==0){
        result = s ;
    }
    else{
        if(d>0){
            result = s.substring(d) + s.substring(0,d) ;
        }
        else{
            result = s.substring(l + d) + s.substring(0,l + d) ;
        }
    }
return result ;
}


0 commentaires

0
votes

Voici ma solution avec JavaScript

function getShiftedString(s, leftShifts, rightShifts) {
    s = getLeftShift(s, leftShifts);
    return getRightShift(s, rightShifts);
}

function getLeftShift(s, leftShifts) {
    leftShifts = leftShifts % s.length;
    return s.slice(leftShifts) + s.slice(0, leftShifts);
}

function getRightShift(s, rightShifts) {
    return getLeftShift(s, -rightShifts)
}


0 commentaires