2
votes

Renvoyer une chaîne qui répète 1 caractère de plus que le nombre de fois où chaque caractère apparaît dans une chaîne

J'essaie de résoudre ce problème en JavaScript, mais j'ai du mal à le faire.

Disons que quelqu'un dit un message comme "ouais" , je dois retourner "yyeeaahh" ou si la fréquence de chaque caractère était inégale dans la chaîne d'origine:

"yyeaaahhh" alors ma fonction devrait renvoyer:

"yyyeeaaaahhhh"

Mon approche était comme suit:

J'ai commencé par transformer la chaîne en un Array de ses caractères.

Après avoir obtenu le tableau, j'ai décidé de créer un objet JavaScript qui a des paires clé-valeur dans le sens où les clés sont les lettres et les valeurs sont le nombre de fois où la lettre apparaît dans la chaîne.

J'ai ensuite découvert la méthode Object.entries () qui me permet d'obtenir un tableau de ces paires clé-valeur sous forme de tableaux.

Là où je suis bloqué, c'est comment mapper ce tableau à un nouveau tableau qui contient les clés affichées (valeur + 1) fois où valeur est la fréquence correspondante de la clé dans le chaîne d'origine.

Dans un contexte plus visuel, je veux passer de ceci à ceci:

[['y', 2], ['e', 3], ['a ', 3], [' h ', 2]] => [' yyy ',' eeee ',' aaaa ',' hhh ']

Après cela, je suppose que je peux rejoignez trivialement ce tableau dans une chaîne pour obtenir ma chaîne résultante.

Voici mon code pour le moment:

function newString(string) {
  const strArr = string.split('')
  var counts = {};
  for (var i = 0; i < strArr.length; i++) {
    if ((string.match(new RegExp(strArr[i], "g"))).length >= 1) {
      counts[string[i]] = (string.match(new RegExp(string[i], "g"))).length;
    }
  }
  var countArr = Object.entries(counts)
  var newStrArr = []
  for(const [key,value] in countArr) {
      newStrArr.push(key.repeat(value + 1))

  }
  return newStrArr 
}

[['y', 2], ['e', 3], ['a', 3], ['h', 2]] => ['yyy', 'eeee', 'aaaa', 'hhh']


1 commentaires

Que se passe-t-il si les pistes sont séparées? par exemple: aba devrait-il être aabbaa ou aaabb ou autre chose?


3 Réponses :


1
votes

Il suffit de créer une variable chaîne et de la concaténer. Parcourez votre tableau créé et obtenez la lettre actuelle et la fréquence de la lettre actuelle. Ensuite, créez une autre boucle pour ajouter la lettre à la fréquence de chaîne + 1 fois.

var str = '';
for (var i = 0; i < newStrArr.length; i++) {
  var letter = newStrArr[i][0];
  var freq = newStrArr[i][1];
  for (var j = 0; j < freq + 1; j++) {
    str += letter;
  }
}


2 commentaires

Il suffit de faire (freq + 1) dans la dernière boucle for pour ajouter ce caractère supplémentaire à la fin ...


Bonne prise, fixe



3
votes

Vous pouvez prendre la puissance de l'expression régulière et rechercher un caractère qui n'est pas répété et le remplacer par deux d'entre eux.

var string = 'yeeaaahhhh';

console.log(string.replace(/(.)(?!\1)/g, '$&$&'));


1 commentaires

S'il s'agissait de deux réponses distinctes, je pourrais voter correctement pour celle que j'aime, qui est la string.replace (/ (.) (?! \ 1) / g, '$ & $ &') technique.



0
votes

Lorsque vous devez transformer un tableau d'une forme en une autre et que vous ne savez pas comment, vous pouvez utiliser Array.reduce . C'est une fonction très puissante qui vous permet d'utiliser une logique personnalisée pour itérer de manière récursive sur un tableau.

const arr = [['y', 2], ['e', 3], ['a', 3], ['h', 2]]

const word = arr.reduce((newWord, currentLetter) => {

  //deconstructing my variables
  const [letter, count] = currentLetter 

  //use a loop and a template literal to alter our string
  //using less than equals we can include 0 in the count
  //effectively adding an extra letter
  for(let i = 0; i <= count; i++) {
    newWord = `${newWord}${letter}`
  }

  //when reducing, don't forget to return your value
  return newWord
}, '')

console.log(word) // --> yyyeeeeaaaahhh

J'espère que cela vous aidera!


0 commentaires