J'ai une mission de faire une méthode pour trouver le mot le plus long dans une chaîne sans scission, distincts et pourach.
J'ai pu diviser les mots et compter la longueur mais je suis coincé sur comment puis-je réellement comparer et écrivez-les. p> La sortie à l'heure actuelle ressemble maintenant à ceci: p> Je suis sûr que je serais sûr que je serais capable d'obtenir uniquement le nombre le plus long à afficher en comparant Compt Strort> avant de réinitialiser avec Temp Int, mais comment écrire le mot avec elle. p> ou s'il y a un moyen plus facile qui probablement est. p> p>
3 Réponses :
Vous êtes déjà de bonne manière. Au lieu d'imprimer directement les mots, conservez la longueur et la position du mot le plus long et imprimez-la à la fin. Comme:
static void longestWord(String s1) { char emp = ' '; int longestLength = 0; int longestStart = 0; int currentStart = 0; for (int i = 0; i < s1.Length; i++) { if (s1[i] == emp || s1[i] == '.') { // calculate the current word length int currentLength = i - currentStart; // test if this is longer than the currently longest if(currentLength > longestLength) { longestLength = currentLength; longestStart = currentStart; } // a new word starts at the next character currentStart = i + 1; } } // print the longest word Console.WriteLine($"Longest word has length {longestLength}: \"{s1.Substring(longestStart, longestLength)}\""); }
C'est génial, j'essayais de le rendre charer et de la scinder / l'écrire de cette façon, mais c'est beaucoup plus facile. Merci!
Je vais vous demander si vous êtes censé traiter "2" code> comme mot et comptez-le du tout. En utilisant Expressions régulières a > Vous permettra d'aborder le problème à l'aide d'un linq one-liner:
static void Main(string[] args)
{
String s1 = "Alex has 2 hands.";
var word = longestWord(s1);
Console.WriteLine(word);
//Console.ReadLine();
}
static string longestWord(string s1) {
return Regex.Matches(s1,"[A-Za-z]+") // find all sequences containing alphabetical characters, you can add numberas as well: [A-Za-z0-9]
.Cast<Match>() // cast results to Enumberable<Match> so we can apply LINQ to it
.OrderByDescending(m => m.Length) // luckily for us, Match comes with Length, so we just sort our results by it
.Select(m => m.Value) // instead of picking up everything, we only want the actual word
.First(); // since we ordered by descending - first item will be the longest word
}
Nous n'avons pas parlé de regex, mais je semble que cela facilite beaucoup plus facilement les choses (l'a vu utiliser beaucoup) afin que je vais y examiner. Merci!
@Sukonbu Je suppose que le point de votre exercice était de travailler à travers un algorithme plutôt que de compter sur les bibliothèques. Si tel est bien le cas, vous seriez mieux avec d'autres solutions proposées. Je ferai cependant souligner que la version LINQ n'effectue pas explicitement scindée, distincte ou pourrespirance en soi (bien que cela repose certainement sur iEnumerable), vous pourriez donc être capable de le remettre.
Vous pouvez stocker pour chaque mot les caractères de la nouvelle liste de caractères (liste de la longueur dynamique)
Et si le nouveau mot est plus long du mot précédent le convertit en chaîne.
Si vous avez deux mots de même longueur, cela prendra le premier.
Si vous voulez le dernier changement, le "Maxlength
Havent a pensé à utiliser la liste <> Je vais y regarder, merci!
Qu'en est-il de Regex ou voulez-vous l'éviter aussi? Cela ferait beaucoup de choses plus simples.
Est-ce que cela répond à votre question? trouver le mot le plus long dans la chaîne
@Twey Tent a réellement la dernière réponse, il a aidé beaucoup (d'autres sont divisés, foresach and regex que nous n'avons pas parlé de ce que nous savons maintenant si je peux l'utiliser). Merci!