我试图在Integer中找到最大值的出现情况。
例如:
int[] ar = [3, 1, 2, 3];
在这里,最大的3
被重复两次,所以预期的输出是2
。
这是可行的,我将被计数为2
,因为最大值3
在数组中发生了两次。
var max = int.MinValue;
var occurrenceCount = 0;
foreach(var x in ar)
{
if (x >= max) max = x;
}
foreach(var x in ar)
{
if (x == max) occurrenceCount++;
}
产出:2//事件计数
有了Linq
就更简单了
var occurrenceCount = ar.Count(x => x == ar.Max())
产出:2//事件计数
如果没有Linq
,是否有任何简化或有效的方法来做到这一点?
发布于 2018-10-18 01:36:54
至少,您可以合并第一个数组。我仍然会使用Linq解决方案。更清楚了。如果您真的想讨论性能,请先阅读哪个更快?。
下面是一个O(n)的解决方案:
int[] ar = {3, 1, 2, 3, 3, 4, 4};
int max = ar[0];
var occurrenceCount = 1;
for(var i = 1; i < ar.Length; i++)
{
if (ar[i] > max) {
max = ar[i];
occurrenceCount = 1;
}
else if (ar[i] == max) {
occurrenceCount++;
}
}
WriteLine(max);
WriteLine(occurrenceCount);
发布于 2018-10-18 01:37:59
我没有用林克。我用兰达:)
int[] ar = new[] { 3, 1, 2, 3 };
var result = ar.GroupBy(x => x) //values groups
.Select(x => new
{
Number = x.Key,
Count = x.Count()
}).OrderByDescending(x => x.Count) //Short
.FirstOrDefault(); //First Result
result.Count // how many
result.Key // max number
没有Linq和没有Lamda
int[] ar = new[] { 3, 1, 2, 3 };
Array.Sort(ar);
Array.Reverse(ar);
var maxValue = ar[0];
var occurrenceCount = 0;
foreach (var item in ar)
{
if (item == maxValue)
occurrenceCount++;
}
发布于 2018-10-18 01:44:06
基于可枚举的Max的实现和GetCount,您可以简单地通过在Max的前端添加一个测试来分解:
public static int CountMax(this IEnumerable<int> source)
{
if (source == null)
{
throw new ArgumentException();
}
int value = 0;
bool hasValue = false;
int count = 0;
foreach (int x in source)
{
if (hasValue)
{
if (x > value)
{
value = x;
count = 1;
}
else if (x == value)
{
count++;
}
}
else
{
value = x;
count = 1;
hasValue = true;
}
}
if (hasValue)
{
return count;
}
throw new Exception("no elements");
}
最酷的一点是,它很容易使它更通用,比如:
public static int CountMax<TSource>(this IEnumerable<TSource> source) where TSource : IComparable
https://stackoverflow.com/questions/52870901
复制相似问题