因此,我试图设计一种算法,通过一次遍历搜索一个数组,以查找其中出现频率最高的数字。我尝试使用两个内部循环来解决它,并且它可以工作,但是这需要多次遍历数组。
现在,我试图通过“一次性”扫描阵列以查找最频繁的数字来找到另一种方式。任何人有什么建议会有所帮助?
答案 0 :(得分:2)
使用LINQ,您可以简单地使用
var mostfrequent = myList.GroupBy(i=>i).OrderByDescending(grp=>grp.Count())
.Select(grp=>grp.Key).First();
编辑
基于OP使用Hashtable的要求,可以如下实现
int mostCommom = array[0];
int occurences = 0;
foreach (int num in array)
{
if (!hs.ContainsKey(num))
{
hs.Add(num, 1);
}
else
{
int tempOccurences = (int)hs[num];
tempOccurences++;
hs.Remove(num);
hs.Add(num, tempOccurences);
if (occurences < tempOccurences)
{
occurences = tempOccurences;
mostCommom = num;
}
}
}
foreach (DictionaryEntry entry in hs)
{
Console.WriteLine("{0}, {1}", entry.Key, entry.Value);
}
Console.WriteLine("The commmon numer is " + mostCommom + " And it appears " + occurences + " times");
答案 1 :(得分:0)
您可以使用Dictionnary并将键设置为数字,然后在遇到已经满足的数字时,在当前数字的值(即键)上加1,并在数组完成后用最高价值。
答案 2 :(得分:0)
类似的事情应该起作用(您需要获取ValueTuple NuGet包才能使该元组调用签名起作用)
public static IEnumerable<int> ListOfInts = new List<int> { 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5 };
public static (int? mostFrequent, int numOccurances) FindMostFrequent(IEnumerable<int> ints) {
int maxNumOccurances = int.MinValue;
int? mostFrequent = null;
//key is number (that occurs), value is number of occurances
var counters = new Dictionary<int, int>();
foreach (var num in ints) {
if (counters.TryGetValue(num, out var occurances)) {
counters[num] = ++occurances;
} else {
counters[num] = 1;
}
if (occurances > maxNumOccurances) {
mostFrequent = num;
maxNumOccurances = occurances;
}
}
return (mostFrequent, maxNumOccurances);
}
它一次通过整数集合。在遍历列表时,它会构建Dictionary<int, int>
,进行N次查找和N次写入(插入或替换)。
如果列表为空,则返回的mostFrequent
部分将为null
。如果最大次数超过一次,您将获得第一个发现的最大次数。如果需要最后一个,请在以下位置将>
更改为>=
:
if (occurances > maxNumOccurances)
,如果希望获得所有可能的结果,请在返回之前执行以下操作:
var maxes = from pair in counters where pair.Value == maxNumOccurances select pair;