Наибольшее значение из массива с самым высоким индексом - PullRequest
0 голосов
/ 10 мая 2019

Мне нужно найти наиболее распространенную цифру в массиве целых чисел, я также хотел бы иметь самый высокий их индекс (число), поэтому, если есть входные данные, такие как [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 голосов
/ 10 мая 2019

Вы можете использовать этот 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;
0 голосов
/ 10 мая 2019

Что касается «простого» способа, вот еще одна альтернатива 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, но разница будет в миллисекундах и не будет заметна для таких маленьких массивов.

0 голосов
/ 10 мая 2019

Вы можете преобразовать каждый элемент списка в строку и объединить их. Затем вы можете сосчитать вхождения каждого символа в этой строке. При сортировке по количеству символов, а затем по значению символа сначала сортируются более высокие символы, если они встречаются с одинаковой частотой:

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;
}

So

Console.WriteLine(MostCommonDigit(new [] { 11, 22, 33 }));
Console.WriteLine(MostCommonDigit(new [] { 111, 22, 33 }));

печать

3
1
...