C#计数字符

时间:2017-11-18 23:21:58

标签: c#

我正在尝试完成一个有一个错误的脑筋急转弯而我找不到它。只是想知道是否有人知道答案。我的目标是返回最常出现的角色。

public string solution(string S)
{
    int[] occurrences = new int[26];
    foreach (char ch in S)
    {
        occurrences[ch - 'a']++;
    }

    char best_char = 'a';
    int best_res = 0;

    for (int i = 1; i < 26; i++)
    {
        if (occurrences[i] >= best_res)
        {
            best_char = (char)('a' + i);
            best_res = occurrences[i];
        }
    }
    return best_char.ToString();
}

5 个答案:

答案 0 :(得分:1)

你有小错误。您的索引应该从0开始,而不是1

for (int i = 0; i < 26; i++)
{
    if (occurrences[i] >= best_res)
    {
        best_char = (char)('a' + i);
        best_res = occurrences[i];
    }
}

另一个更安全的版本是

public string Solution(string text)
{
    string strResponse = string.Empty;
    if (!string.IsNullOrEmpty(text))
    {
        List<KeyValuePair<char, int>> occurance = text.GroupBy(ch => ch)
                                                      .Where(grp => char.IsLetter(grp.Key))
                                                      .Select(grp => new KeyValuePair<char, int>(grp.Key, grp.Count()))
                                                      .OrderByDescending(c => c.Value)
                                                      .ToList();

        if (occurance.Any())
            strResponse = occurance.First().Key.ToString();
    }
    return strResponse;
}

答案 1 :(得分:0)

public static string solution(string S)
{
    var charDict = new Dictionary<char, int>();

    foreach (char c in S.Where(c => !char.IsWhiteSpace(c)))
    {
        if(!charDict.TryGetValue(c, out int count))
        {
            charDict[c] = 1;
        }
        charDict[c]++;

    }

    return charDict.OrderByDescending(kvp => kvp.Value).First().Key.ToString();
}

我认为使用字典和LINQ会更好。不要只是复制这段代码并将其粘贴到任何家庭作业或课堂中,用它来学习,否则浪费我的时间和你的真实

答案 2 :(得分:0)

实际上可能有多个字符具有最大出现次数,因此:

private static Char[] GetMostFrequentChars(String text)
{
    Dictionary<Char,Int32> rank = new Dictionary<Char,Int32>();

    foreach (Char c in text.Where(c => !char.IsWhiteSpace(c)))
    {
        if (rank.ContainsKey(c))
            rank[c]++;
        else
            rank.Add(c, 1);
    }

    return rank.Where(r => r.Value == rank.Values.Max()).Select(x => x.Key).ToArray();
}

答案 3 :(得分:0)

如果您不关心特殊字符(如空格),可以使用LINQ:

执行此操作
public static GetMostFrequentCharacter(string value)
{
    return value
        .GroupBy(o => o)
        .OrderByDescending(o => o.Count())
        .First()
        .Key
        .ToString()
}

答案 4 :(得分:0)

至少有两个问题:

  • 正如@AdemÇatamak所说,for循环应该从索引0开始

  • ch - 如果字符串包含除a-z小写之外的任何其他字符,则'a'将抛出异常,