如何用最多的元音打印单词

时间:2018-11-26 15:47:45

标签: c#

我得到了一个代码,该代码在具有至少3个不同元音的行中找到一个单词。问题是我不知道为什么会超出范围。

static string findword(string e)
{
    char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
    char[] sk = { ' ', '.', ',', '!', '?', ':', ';', '(', ')', '\t' };
     string word= "";
    string[] parts = e.Split(sk, StringSplitOptions.RemoveEmptyEntries);
        for (int i = 0; i < e.Length; i++)
        {
            if (parts[i].IndexOf(vowels[i]) >= 3)
            {
                word = parts[i];
            }
        }
    return word;
}

因此对于e = "I was going home today",它应该返回"today"

3 个答案:

答案 0 :(得分:4)

i从0到e.Length - 1,但是您可以使用它来访问数组parts,该数组的长度可以不同,也可以不一样。

答案 1 :(得分:2)

这是我的版本:

        var e = "I was going home today";

        char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
        char[] sk = { ' ', '.', ',', '!', '?', ':', ';', '(', ')', '\t' };
        string word = "";
        string[] parts = e.Split(sk, StringSplitOptions.RemoveEmptyEntries);
        var mostVowels = 0;

        for (int i = 0; i < parts.Length; i++)
        {
            var part = parts[i];
            var numberOfVowels = 0;
            foreach (var vowel in vowels)
            {
                if (part.Contains(vowel)) numberOfVowels++;
            }

            if (mostVowels < numberOfVowels)
            {
                mostVowels = i;
                word = part;
            }
        }
        return(word);

它循环遍历各个部分,然后另一个循环检查该部分是否包含每个元音。然后检查这个词是否比先前的最好。

请注意,这将返回“ going”,因为它是带有两个元音的第一个单词。

还请注意,我使用了“ foreach”而不是普通的for循环,这有助于避免许多常见的错误。

此代码可能会更好,因为它只对每个元音查找一次。像“ Aardvark”这样的单词只能得到1分。毫无疑问,使用LINQ和正则表达式确实有一种非常简洁的方法,但是希望这可以帮助您了解循环和数组出了什么问题。

编辑:这是为您提供的regex和LINQ版本:

    var r = new Regex("(a|e|i|o|u)");
    var mostVowels = parts.Max(y => r.Matches(y).Count);
    var result = parts.First(x => r.Matches(x).Count == mostVowels);

Regex是查找元音的助手。第一个查询计算出每个单词中的元音数量并返回最大值。第二个单词找到第一个带有这么多元音的单词。

答案 2 :(得分:0)

问题是

  

为什么它越界

(问题标题提出的问题与上下文完全不同,建议修正标题。)

然后答案很简单。正因为如此:

原因1:

for (int i = 0; i < e.Length; i++)

应该是:

for (int i = 0; i < parths.Length; i++)

原因2:

if (parts[i].IndexOf(vowels[i]) >= 3)

应该是:

if (CountVowels(parts[i]) >= 3)

不幸的是,CountVowels函数超出了此问题的范围,并且由于它听起来像是一项家庭作业,因此您需要自行创建函数CountVowels