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.
4 Réponses :
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), ]);
Belle réponse!
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(""));
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 ; }
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) }
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 êtrecdef
+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.