Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trouver la première lettre qui ne se répète pas

    21 janvier 2020 à 1:08:57

    Bonsoir voulant m’entraîner à l'algo je fais des exercices mais la je bloque depuis un moment ... si vous pouviez me donner une piste ?

    voici l'énoncé :

    Écrivez une fonction nommée first_non_repeating_letter qui prend une entrée de chaîne et renvoie le premier caractère qui n'est répété nulle part dans la chaîne.

    Par exemple, si on lui donne l'entrée «stress», la fonction devrait retourner «t», car la lettre t n'apparaît qu'une seule fois dans la chaîne et apparaît en premier dans la chaîne.

    Comme défi supplémentaire, les lettres majuscules et minuscules sont considérées comme le même caractère, mais la fonction doit renvoyer la casse correcte pour la lettre initiale. Par exemple, l'entrée 'sTreSS' doit retourner 'T'.

    Si une chaîne contient tous les caractères répétitifs, elle doit renvoyer une chaîne vide ("") ou Aucune - voir des exemples de tests.

    Mon code réussi 9 test sur 11... Le voici :

    function firstNonRepeatingLetter(s) {
    let saveRepetition = []
    let comparaison = 0 
    let suivant = 0
    let i = 0
    
    if (s.length <= 1) {
        return s
    }
      while (s[i]){ 
          comparaison = 0
          suivant = i + 1
          while (s[suivant]) {
              if (s[i] === s[suivant]) {
                  comparaison++
              }
              suivant++
          }
          if (comparaison >= 1) {
              saveRepetition = saveRepetition + s[i]
              console.log(save) 
             
          } else if (comparaison === 0) {
              suivant = 0
              while(saveRepetition[suivant]) {
                  if (saveRepetition[suivant] === s[i]) {
                      comparaison++ 
                  }
                  suivant++
              }
              if (comparaison === 0) {
                  return s[i]
              }
          } 
          i++
      }
      return ""
    }

    Je pense que le problème vient des maj/min mais je n'en suis pas sur a 100%.

    Désolé si la question ne parrait pas pertinente ou que le problème est facile a résoudre 

    Merci d'avance 

    -
    Edité par Elyakim 21 janvier 2020 à 10:42:10

    • Partager sur Facebook
    • Partager sur Twitter
      21 janvier 2020 à 7:45:34 - Message modéré pour le motif suivant : La demande de l'équipe de modération a été honorée.


      Pas d'aide concernant le code par MP, le forum est là pour ça :)

        21 janvier 2020 à 10:02:03

        Salut,

        Tu dois réaliser tes comparaisons de lettre avec uniquement des majuscules ou uniquement des minuscules. Donc utilise 'toLowerCase()' ou 'toUpperCase()' :

        function firstNonRepeatingLetter(s) {
        let saveRepetition = []
        let comparaison = 0
        let suivant = 0
        let i = 0
         
        if (s.length <= 1) {
            return s
        }
          while (s[i]){
              comparaison = 0
              suivant = i + 1
              while (s[suivant]) {
                  if (s[i].toLowerCase() === s[suivant].toLowerCase()) {
                      comparaison++
                  }
                  suivant++
              }
              if (comparaison >= 1) {
                  saveRepetition = saveRepetition + s[i]
                  
              } else if (comparaison === 0) {
                  suivant = 0
                  while(saveRepetition[suivant]) {
                      if (saveRepetition[suivant].toLowerCase() === s[i].toLowerCase()) {
                          comparaison++
                      }
                      suivant++
                  }
                  if (comparaison === 0) {
                      return s[i]
                  }
              }
              i++
          }
          return ""
        }

        Je te propose également cette méthode qui est plus explicite (à mon sens) :

        const first_non_repeating_letter = function(str) {
            const arr1 = str.split(''); // Obtenir un array à partir de str.
            const arr2 = str.toLowerCase().split(''); // Obtenir un second array à partir de str, mais ne contenant que des minuscules.
            return arr1.find((x, i) => { // Rechercher et renvoyer la première entrée de arr1 respectant la condition issue de la fonction anonyme suivante :
                const arr3 = arr2.slice(); // Obtenir une copie superficielle de arr2 dans arr3 pour éviter d'altérer arr2 par la suite.
                arr3.splice(i, 1); // Supprimer la lettre à la position i de l'arr3.
                return !arr3.some(y => x.toLowerCase() === y); // Retourner False si arr3 contient toujours au moins une fois la lettre qui vient d'être supprimer (qu'elle soit majuscule ou minuscule), retourner True si non.
            });
        };

        Documentation :

        Utilise des point-vigules pour terminer tes instructions.

        -
        Edité par BrainError 21 janvier 2020 à 13:53:17

        • Partager sur Facebook
        • Partager sur Twitter
          21 janvier 2020 à 10:40:04

          bonjour j'ai essayé d'utiliser splice, toLowerCase et je crois que je ne peux pas utiliser ces fonction toutes faites, peu être regarder du coter des ascii ?
          • Partager sur Facebook
          • Partager sur Twitter
            21 janvier 2020 à 11:40:38

            Toutes les fonctions que j'ai employé dans mon exemple sont des fonctions de base de javascript et tu peux tout à fait les utiliser.
            Tu peux directement tester la fonction first_non_repeating_letter sur une console chrome par exemple pour t'en rendre compte.

            Pour ce qui est de Splice, la fonction renvoie les éléments qui ont été supprimé ET modifie l'Array qui à servi de contexte.
            Ainsi si tu as :

            const arr1 = ['T', 'e', 's', 't'];

            et que tu utilise l'instruction :

            const arr2 = arr1.splice(1, 1);

            alors arr1 sera égal à "['T', 's', 't']" et arr2 sera égal à "['e']".

            • Partager sur Facebook
            • Partager sur Twitter
              21 janvier 2020 à 12:08:24

              Quand je l'emploi la console met une erreur en disant que ce n'est pas une fonction je vais réessayer alors, tu t'y connais mieux que moi ! :) 

              • Partager sur Facebook
              • Partager sur Twitter
                21 janvier 2020 à 12:28:05

                Bonjour,

                une autre solutions serait de passer par une regexp comme ceci:

                const FNRL= function(str) { //First Non Repeating Letter
                    //On duplique la chaine de caractère dans une autre variable
                    //Et on la "transforme" en Array avec String.prototype.split()
                    let lettres= str.split('');
                    //On boucle tant que l'array n'est pas vite
                    while(lettres.length>0) {
                        //On récupére la première lettre, et on la supprime du tableau
                        //Avec Array.prototype.shift()
                        let lettre = lettres.shift(),
                            //On construit la RegExp avec le constructeur RegExp
                            regexp = new RegExp(lettre, 'gi'),
                            //On utilise String.prototype.matchAll() pour récupéré
                            //tout les lettres correspondante.
                            //Et transforme l'itérateur en Array avec [... Iterateur]
                            //J'utilise le paramètres du reste pour avoir une syntaxe
                            //plus courte parce que les explications prennent beaucoup
                            //trop de place >.> mais tu peut faire la conversion autrement.
                            resultat = [...str.matchAll(regexp)];
                        //On vérifie si notre tableau contient moins de 2 resultat si
                        //c'est le cas, ça signifie que la lettre est unique.
                        if(resultat.length<2) {
                            //On force la fin de la boucle avec return. (puisque le
                            //reste ne nous interesse pas).
                            //et ont renvoie la lettre qui a matcher (lettre).
                            return lettre; 
                        }
                    } return false; //On renvoie false si aucune lettre n'est unique
                };
                
                console.log(FNRL('sTreSS')); //Affiche "T"

                Si les commentaires te rebute un peu, sache que sans les commentaire le code ressemble à ça : 

                const FNRL= function(str) {
                    let lettres= str.split('');
                    while(lettres.length>0) {
                        let lettre = lettres.shift(),
                            regexp = new RegExp(lettre, 'gi'),
                            resultat = [...str.matchAll(regexp)];
                        if(resultat.length<2) {
                            return lettre; 
                        }
                    } return false;
                };
                console.log(FNRL('sTreSS'));

                Maintenant place au lien utile (parce que j'explique ce que je fait mais pas comment ça marche :p) :

                 - J'utilise une constante pour déclarer ma fonction, et a l'intérieur j'utilise des variables à faible portée let.
                 - J'utilise la méthode split()
                 - J'utilise la méthode shift().
                 - J'utilise le constructeur RegExp().
                 - J'utilise la méthode matchAll() en combinaison avec le paramètre du reste.

                Bonne lecture :)

                • Partager sur Facebook
                • Partager sur Twitter

                    !

                  21 janvier 2020 à 12:41:11

                  Çà y est j'ai réussi, il était tard quand j'essayais d'utiliser les fonction de base j'ai du faire n'importe quoi, merci a toi. Par contre je l'ai plus fais a ma façon car ta solution m'est moins évidente, ma logique était elle mauvaise ? Je vais et j'ai un peu de mal avec les fonctions fléchés, je vais regarder la doc que tu m'as donner et essayer de tout comprendre à ta manière de faire ! Merci beaucoup a toi ! :D

                  EDIT : Quand je vois les solutions de certains ... problème réglé en une ligne ... et effectivement certains on utilisé un RegExp je vais aussi pencher la dessus, merci a vous deux ! 

                  -
                  Edité par Elyakim 21 janvier 2020 à 12:49:00

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Trouver la première lettre qui ne se répète pas

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown