我正在尝试完成一个有一个错误的脑筋急转弯而我找不到它。只是想知道是否有人知道答案。我的目标是返回最常出现的角色。
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();
}
答案 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'将抛出异常,