Найдите большую часть происходящего числа в Списке <интервал>

25
задан nawfal 31 May 2013 в 05:10
поделиться

4 ответа

Как насчет:

var most = list.GroupBy(i=>i).OrderByDescending(grp=>grp.Count())
      .Select(grp=>grp.Key).First();

или в синтаксисе запроса:

var most = (from i in list
            group i by i into grp
            orderby grp.Count() descending
            select grp.Key).First();

, Конечно, при использовании этого неоднократно Вы могли бы добавить дополнительный метод:

public static T MostCommon<T>(this IEnumerable<T> list)
{
    return ... // previous code
}

Тогда можно использовать:

var most = list.MostCommon();
71
ответ дан Marc Gravell 28 November 2019 в 17:56
поделиться

Не уверен насчет лямбда-выражений, но я бы

  1. Сортировать список [O (n log n)]

  2. Сканирование список [O (n)] найти самую длинную серию.

  3. Сканируйте снова [O (n)], сообщая о каждом номере, имеющем эту длину серии.

Это потому, что может быть более одного наиболее часто встречающегося числа.

4
ответ дан Mike Dunlavey 28 November 2019 в 17:56
поделиться

Кто-то попросил решение, где существуют связи. Вот удар в этом:

int indicator = 0

var result =
  list.GroupBy(i => i)
    .Select(g => new {i = g.Key, count = g.Count()}
    .OrderByDescending(x => x.count)
    .TakeWhile(x =>
    {
      if (x.count == indicator || indicator == 0)
      {
        indicator = x.count;
        return true;
      }
      return false;
    })
    .Select(x => x.i);
0
ответ дан Amy B 28 November 2019 в 17:56
поделиться

Вот еще один ответ, который кажется быстрым. Я думаю ответ Науфаля , как правило, быстрее, но это может затенить его на длинных последовательностях.

public static IEnumerable<T> Mode<T>(
    this IEnumerable<T> source,
    IEqualityComparer<T> comparer = null)
{
    var counts = source.GroupBy(t => t, comparer)
        .Select(g => new { g.Key, Count = g.Count() })
        .ToList();

    if (counts.Count == 0)
    {
        return Enumerable.Empty<T>();
    }

    var maxes = new List<int>(5);
    int maxCount = 1;

    for (var i = 0; i < counts.Count; i++)
    {
        if (counts[i].Count < maxCount)
        {
            continue;
        }

        if (counts[i].Count > maxCount)
        {
            maxes.Clear();
            maxCount = counts[i].Count;
        }

        maxes.Add(i);
    }

    return maxes.Select(i => counts[i].Key);
}
1
ответ дан Community 28 November 2019 в 17:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: