我想在整数数组中找到前3个最大重复数?
以下是我尝试过的一段代码但我无法找到所需的结果:
static void Main(string[] args)
{
int[,] numbers = {
{1, 2, 0, 6 },
{5, 6, 7, 0 },
{9, 3, 6, 2 },
{6, 4, 8, 1 }
};
int count = 0;
List<int> checkedNumbers = new List<int>();
foreach (int t in numbers)
{
if (!checkedNumbers.Contains(t))
{
foreach (int m in numbers)
{
if (m == t)
{
count++;
}
}
Console.WriteLine("Number {0} is Repeated {1} Times ", t, count);
count = 0;
checkedNumbers.Add(t);
}
}
Console.ReadLine();
}
答案 0 :(得分:5)
您可以根据每个组中的计数使用LINQ中的GroupBy
,然后使用OrderByDescending
:
var result = list.GroupBy(i => i)
.OrderByDescending(g => g.Count())
.Select(g => g.Key)
.Take(3);
修改:使用您的代码,您可以使用OfType
展平您的矩阵,然后使用上面的代码:
int[,] numbers = {
{1, 2, 0, 6 },
{5, 6, 7, 0 },
{9, 3, 6, 2 },
{6, 4, 8, 1 }
};
var list = numbers.OfType<int>();
答案 1 :(得分:1)
int[] numbers = {1, 2, 3, 5, 6, 32, 2, 4, 42, 2, 4, 4, 5, 6, 3, 4};
var counts = new Dictionary<int, int>();
foreach (var number in numbers)
{
counts[number] = counts[number] + 1;
}
var top3 = counts.OrderByDescending(x => x.Value).Select(x => x.Key).Take(3);
答案 2 :(得分:1)
<强>提示:强>
你可以在LINQ的帮助下做到这一点 这是找到大多数frequest出现元素的代码: -
List<int> list = new List<int>() { 1,1,2,2,3,4,5 };
// group by value and count frequency
var query = from i in list
group i by i into g
select new {g.Key, Count = g.Count()};
// compute the maximum frequency
int frequency = query.Max(g => g.Count);
// find the values with that frequency
IEnumerable<int> modes = query
.Where(g => g.Count == frequency)
.Select(g => g.Key);
// dump to console
foreach(var mode in modes) {
Console.WriteLine(mode);
}
同样,你也可以找到另外两个。
答案 3 :(得分:1)
我看到现有的答案都没有提供解释,所以我会尝试解释。
您需要做的是计算每个项目在数组中出现的次数。为此,有各种方法(字典,linq等)。可能最简单的方法是使用包含数字的字典,以及它出现的次数:
int numbers[] = {1, 3, 6, 10, 9, 3, 3, 1, 10} ;
Dictionary<int, int> dic = new Dictionary<int, int>();
现在遍历数字中的每个元素,并将其添加到字典中。如果已添加,只需增加计数值。
foreach (var i in numbers)
{
dic[i]++; // Same as dic[i] = dic[i]+1;
}
如果字词不存在,字典会自动添加新项目,因此我们只需dic[i]++;
接下来,我们需要获得最高的3个值。同样,有很多方法可以做到这一点,但最简单的方法就是对它进行排序。
var sorted_dic = dic.OrderByDescending(x => x.Value);
现在sorted_dic
中的前3个项目将是您要查找的3个值。
有多种方法可以只获取这3个,例如使用Take
方法:
var first_3 = sorted_dic.Take(3);
现在您可以遍历这3个值,例如在屏幕上打印它们:
foreach (var i in first_3)
{
Console.Write("{0} appeared {1} times.", i.Key, i.Value);
}