数组中索引值最高的最大值

时间:2019-05-09 21:47:38

标签: c# max

我需要找到一个整数数组中最常见的数字,我也想拥有它们中最高的索引(数字),因此,如果输入像[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;
    }

3 个答案:

答案 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的开销,它的速度可能比您的解决方案慢几倍,但是这种差异将以毫秒为单位,对于如此小的阵列来说并不明显。