我需要找到一个整数数组中最常见的数字,我也想拥有它们中最高的索引(数字),因此,如果输入像[11、22、33],则它将返回3而不是1.如何轻松实现?
static uint mostCommonDigit(uint[] n)
{
uint[] numbersFrequency = new uint[10];
foreach(uint i in n)
{
uint a = i;
if (a != 0)
{
while (a>0)
{
uint d = a % 10;
a = a / 10;
numbersFrequency[d] += 1;
}
}
}
uint max = numbersFrequency.Max();
int index = Array.IndexOf(numbersFrequency, max);
return (uint)index;
}
答案 0 :(得分:0)
您可以将列表的每个元素转换为字符串并将其连接起来。然后,您可以计算该字符串中每个字符的出现次数。通过按字符计数排序,然后按字符值排序,如果较高的字符以相同的频率出现,则将首先对其进行排序:
char MostCommonDigit(int[] list)
{
return list.Aggregate("", (i, j) => $"{i}{j}")
.GroupBy(c => c)
.Select(
g => new {
Char = g.Key,
Count = g.Count()
})
.OrderByDescending(x => x.Count)
.ThenByDescending(x => x.Char)
.First().Char;
}
所以
Console.WriteLine(MostCommonDigit(new [] { 11, 22, 33 }));
Console.WriteLine(MostCommonDigit(new [] { 111, 22, 33 }));
打印
3
1
答案 1 :(得分:0)
您可以使用此linq来获取职位:
List<int> iii = new List<int> { 11, 22, 33 };
int yyy2 = iii.IndexOf(iii.Last(y => y.ToString().GroupBy(c => c).Select(c => c.Count()).Max() == iii.Select(x => x.ToString().GroupBy(c => c).Select(c => c.Count()).Max()).Max())) + 1;
答案 2 :(得分:0)
就“简便”方式而言,这是另一种LINQ替代方案:
static uint mostCommonDigit(uint[] n) =>
(uint)string.Concat(n).GroupBy(c => c).Max(g => (g.Count(), g.Key - '0')).Key
string.Concat
将数组转换为字符串(例如“ 112233”)。
GroupBy
按字符对字符串中的字符进行分组(例如'1'=> ['1','1'],'2'=> ['2','2'])。
Max部分类似于按每个组中的项目数排序,然后按每个组的键排序,然后得到最后一个项目,但是避免了排序。 - '0'
部分将字符键转换为整数。
由于LINQ的开销,它的速度可能比您的解决方案慢几倍,但是这种差异将以毫秒为单位,对于如此小的阵列来说并不明显。