Re: Самая длинная непрерывная последовательность
От: arkhivania  
Дата: 01.08.12 13:27
Оценка:
Здравствуйте, vorona, Вы писали:

V>На собеседовании попросили написать Linq запрос, выбирающий самую длинную непрерывную последовательность.

V>У меня получилось так:

V>
V>using System;
V>using System.Linq;

V>static class Program
V>{
V>    static void Main(string[] args)
V>    {
V>        Object[] s = { "w", "a", "a", "b", "b", "b", "f", "a", "w", "w", "a", "b" };
V>        var result = s.Select((k, i) => new { k, i }).GroupBy(p => p.k, p => p.i).SelectMany(g => g.Select((i, j) => new { k = g.Key, c = i - j }))
V>            .GroupBy(p => new { p.k, p.c }, p => p.k, (k, e) => new { k = k.k, c = e.Count() }).Aggregate((p1, p2) => p1.c > p2.c ? p1 : p2);
V>        Console.WriteLine(String.Format("{0} встречается - {1} раз", result.k, result.c));
V>    }
V>}
V>


V>Может кто знает способ попроще.


Я вот такой придумал, не думаю, что он сильно правильнее:

var symbols = new[] { "w", "a", "a", "b", "b", "b", "f", "a", "w", "w", "a", "b", "b", "b" };
                var max_count_item = new int[symbols.Length]
                    .Select((w, index) => symbols.Skip(index)).
                    Select(w => new
                    {
                        Item = w.FirstOrDefault(),
                        ItemsAfterCount = w.TakeWhile(w2 => w2 == w.FirstOrDefault()).Count()
                    }).OrderByDescending(w => w.ItemsAfterCount).
                    Select(w => 
                        new { Count = w.ItemsAfterCount, Item = w.Item }).First();
                Console.WriteLine(String.Format("{0} встречается - {1} раз", max_count_item.Item, max_count_item.Count));


Вам бы посоветовал на собедесованиях не использовать переменные в один символ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.