【问题标题】:Finding most frequent char for a given word [duplicate]查找给定单词的最常见字符[重复]
【发布时间】:2019-10-08 08:47:06
【问题描述】:

我想使用 System.Linq 编写一个返回字符串中第一个、最常见的字符的方法。 例如:“AABABBC”=> 'A'。 如果两个字母出现相同,则应返回字符串中出现的第一个。

下面的示例应该可以工作。但是,我试图找到一个更有效的解决方案,这并不意味着首先对字符进行排序。 我正在考虑使用 Enumerable.Aggregate() 来计算重复次数,同时还要遍历单词。不知道该怎么做,虽然...... 有任何想法吗?谢谢:)

    public static char MostAparitionsChar(string word)
    {
       return word.GroupBy(x => x)
            .OrderByDescending(x => x.Count())
            .Select(g => g.Key)
            .First();  
    }

【问题讨论】:

  • 请问您的情况更有效是什么?它应该更快还是消耗更少的内存?
  • 更快 :) 我不想在我的字符串中迭代 3 次,而是只想迭代一次
  • 是什么让你认为你的代码会遍历你的字符串 3 次?
  • 问题:如果所有字母的出现次数相同怎么办? “abcd”
  • 是不区分大小写的匹配吗?

标签: c# .net linq aggregate ienumerable


【解决方案1】:

我不知道 OrderByDescending 的确切实现,但我认为它不会比 O(n*log n) 快。但是找到一个最大值应该只是 O(n)。因此,如果您不排序,您可以节省一些时间,但只寻找最大值:

public static char MostAparitionsChar(string word)
 {
 char result = ' ';
 int max = int.MinValue;
 foreach(var grouping in word.GroupBy(x => x))
  {
  int count = grouping.Count();
  if(count > max)
   {
   max = count;
   result = grouping.Key;
  }
 }
 return result;
}

【讨论】:

  • 请注意,这仅适用于 .NET Framework。 .NET Core 已经对OrderBy(...).First()进行了优化
猜你喜欢
  • 2014-12-14
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 2018-04-01
  • 2015-08-15
  • 2014-12-10
相关资源
最近更新 更多