powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / [Задача] Группировка чисел
24 сообщений из 24, страница 1 из 1
[Задача] Группировка чисел
    #38487765
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дано: случайная последовательность целых чисел, сами числа не повторяются.
Задача: сгруппировать последовательные числа (т.е. разница между N -м и N-1 -м числом равна 1) в отдельные массивы. Последовательность можно не сохранять.

В качестве иллюстрации:
Код: plaintext
1, 3, 2, 12, 6, 11, 10 -> [ 1, 2, 3 ], [ 6 ], [ 10, 11, 12 ]

Отдельные бонусы за LINQ.
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38487817
Sergey S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не самый лучший вариант.....
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
int[] array = { 14, 1, 3, 15, 2, 10, 6, 9, 11, 8, 13};
        List<List<int>> list = new List<List<int>>();

        int min = array.Min();
        int max = array.Max();
        int i=min;
        
        foreach (int item in array.OrderBy(n => n))
        {
            if ((array.Where(n => n < item).Count() > 0) &&
                    ((item - array.Where(n=>n<item).Max())==1))
            {
                if (list.Count == 0)
                    list.Add(new List<int>()); ;
                list[list.Count - 1].Add(item);
            }
            else
            {
                list.Add(new List<int>());
                list[list.Count - 1].Add(item);
            }
            i++;
        }
        Console.WriteLine(i);
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38487823
Sergey S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Там правда куча мусора осталось....
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38487834
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey SТам правда куча мусора осталось....

аналогично, набрал первое, что пришло в голову, даже отлаживать не пришлось

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
        static void Main(string[] args)
        {
            var numbers = new int[] {1, 3, 2, 12, 6, 11, 10};
            var dic = numbers.ToDictionary(number => number, number => true);

            var min = numbers.Min();
            var max = numbers.Max();

            List<List<int>> res = new List<List<int>>();

            List<int> promRes = new List<int>();
            for (int i = min; i <= max; i++)
            {
                bool bv;
                if (dic.TryGetValue(i, out bv))
                {
                    promRes.Add(i);
                }
                else
                {
                    res.Add(promRes);
                    promRes = new List<int>();
                }
            }
            if (promRes.Count > 0)
                res.Add(promRes);

            var enumerable = res.Where(l => l.Count > 0);
            foreach (List<int> list in enumerable)
            {
                list.ForEach(i => Console.Write("{0} ", i));
                Console.WriteLine();
            }

            Console.ReadLine();
        }
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38487843
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Красившей, господа!
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38487880
Sergey S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        int[] array = { 14, 1, 3, 15, 2, 10, 6, 9, 11, 8, 13};
        List<List<int>> list = new List<List<int>>();

        var arr = array.OrderBy(n => n).ToList();
        foreach (int item in arr)
        {
            var t = arr.Where(n => n < item && item - n == 1).SingleOrDefault();
            if (t == 0)
                list.Add(new List<int>());
             list[list.Count - 1].Add(item);
        }
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38487887
Sergey S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Практически тоже самое:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
        int[] array = { 14, 1, 3, 15, 2, 10, 6, 9, 11, 8, 13 };
        List<List<int>> list = new List<List<int>>();

        array.OrderBy(n => n).ToList().ForEach((n) =>
        {
            if(array.Where(k => k < n && n - k == 1).FirstOrDefault()==0)
                list.Add(new List<int>());
            list[list.Count - 1].Add(n);
        });
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38488123
Фотография Esofter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
        private static void Main(string[] args)
        {
            int[] array = {14, 1, 3, 15, 2, 10, 6, 9, 11, 8, 13};
            var result = TrickyGroup(array);
            foreach (var item in result)
            {
                foreach (var i in item)
                {
                    Console.Write("{0} ", i);
                }

                Console.WriteLine();
            }
        }

        private static IEnumerable<IEnumerable<int>> TrickyGroup(IEnumerable<int> list)
        {
            return Extract(list.OrderBy(x=>x).AsEnumerable(), new List<IEnumerable<int>>());
        }

        private static IEnumerable<IEnumerable<int>> Extract(IEnumerable<int> list, List<IEnumerable<int>> acc)
        {
            if (!list.Any())
            {
                return acc;
            }

            var ll = new LinkedList<int>(list);
            var part = ll.TakeWhile((x,i) =>i==0 || Predicate(ll, x));
            acc.Add(part);
            return Extract(list.Skip(part.Count()), acc);
        }

        public static bool Predicate(LinkedList<int> all, int value)
        {
            var ln = all.Find(value);
            if (ln == null)
            {
                return false;
            }

            return Math.Abs(ln.Previous.Value - value) == 1;
        }
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38488189
Фотография Esofter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то с линкедлистом не красиво как-то :(

второй вариант

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
        private static void Main(string[] args)
        {
            int[] array = {14, 1, 3, 15, 2, 10, 6, 9, 11, 8, 13};
            var result = TrickyGroup(array.OrderBy(x=>x).ToArray());

            foreach (var item in result)
            {
                foreach (var i in item)
                {
                    Console.Write("{0} ", i);
                }

                Console.WriteLine();
            }
        }

        private static IEnumerable<IEnumerable<int>> TrickyGroup(IList<int> list)
        {
            var ind = 0;
            var skip = 0;
            foreach (var i in list.Skip(1).Zip(Enumerable.Range(0, list.Count), (f, s) => Math.Abs(f - list[s])))
            {
                if (i > 1)
                {
                    var res = list.Skip(skip).Take((ind)-skip).ToArray();
                    skip += res.Count();
                    yield return res;
                }

                ind++;
            }

            yield return list.Skip(skip);
        }



надо еще подумать, как от этих переменных состояния избавиться...
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38488196
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучДано: случайная последовательность целых чисел, сами числа не повторяются.
какая длина последовательности и каковы мощности.

а то как то попалась "задачка" , отсортировать массив , который в память не влезает . за определённое время.
( память гиг, а массив 10 гигов)
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38488283
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучОтдельные бонусы за LINQ.Сомневаюсь, что декларативное решение одним LINQ-запросом будет красивше циклов, если речь об этом.
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38488419
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LINQ не нужен :-)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
            var src = new[] { 1, 3, 2, 12, 6, 11, 10 };

            var result = new List<List<int>>();

            foreach (var item in src.OrderBy(v => v))
            {
                if (result.Count > 0)
                {
                    var lastGroup = result[result.Count - 1];

                    if (lastGroup[lastGroup.Count - 1] == item - 1)
                    {
                        lastGroup.Add(item);
                        continue;
                    }
                }

                result.Add(new List<int> { item });
            }
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38488452
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erкакая длина последовательности и каковы мощности.Всем можно пренебречь -- задачка исключительно для разминки ума.
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38488461
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Намек: что будет, если список отсортировать и из числа вычесть значение его позиции в этом списке?
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38488496
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучНамек: что будет, если список отсортировать и из числа вычесть значение его позиции в этом списке?
Любопытно, сам бы не догадался. Вчера перепробовал всё кроме этого. :-)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
        static void Main(string[] args)
        {
            var src = new[] { 1, 3, 2, 12, 6, 11, 10 };

            Array.Sort(src);

            var q =
                from i in Enumerable.Range(0, src.Length)
                let item = new { V = src[i], Diff = src[i] - i }
                group item by item.Diff into g
                select g.Select(v => v.V).ToArray();

            var result = q.ToArray();
        }
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38488505
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нахлобуч,
как-то так
Код: c#
1.
2.
3.
4.
5.
6.
int[] array = { 14, 1, 3, 15, 2, 10, 6, 9, 11, 8, 13 };
var ret = array.OrderBy(x => x)
                .Select((x, i) => new { X = x, G = x - i })
                .GroupBy(x => x.G)
                .Select(g => g.Select(v => v.X).ToArray())
                .ToArray();
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38488508
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучНамек: что будет, если список отсортировать и из числа вычесть значение его позиции в этом списке?
будет для
НахлобучВ качестве иллюстрации:
Код: plaintext
1, 3, 2, 12, 6, 11, 10 -> [ 1, 2, 3 ], [ 6 ], [ 10, 11, 12 ]

что-то вроде:

0,0,0, 2, 5,5,5
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38488707
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучНамек: что будет, если список отсортировать и из числа вычесть значение его позиции в этом списке?
Код: c#
1.
2.
3.
int[] arr = { 1, 3, 2, 12, 6, 11, 10 };
           var data = arr.OrderBy(x => x).Select((x, y) => new { x, y })
               .GroupBy(x => x.x - x.y);
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38488782
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на Scala

Код: c#
1.
2.
val l = List(1, 3, 2, 12, 6, 11, 10)
val result = (l.sorted.zipWithIndex groupBy { case (e, i) => e - i }).values map (_ map { case (e, i) => e })



без использования индексов

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
val l = List(1, 3, 2, 12, 6, 11, 10)
val result = (l.sorted foldLeft List[List[Int]]())(
      (a, v) => a match {
        case Nil => List(List(v))
        case x :: xs => x match {
          case y :: ys => 
            if (v - y == 1) 
              (v :: x) :: xs 
            else 
              List(v) :: a
        }
      }).reverse map (_.reverse)
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38489009
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
int[] arr = { 1, 3, 2, 12, 6, 11, 10 };
           var counter = 0;
           var data3 = (from d in Enumerable.Range(arr.Min(), arr.Max())
                        select arr.Contains(d) ? new { Value = d, Key = counter } : new { Value = arr.Min() - d, Key = ++counter })
                       .Where(x => x.Value >= arr.Min())
                       .GroupBy(x => x.Key);
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38489263
Tamozhnya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
private void rr() {
var data = new List<int> { 1, 3, 2, 12, 6, 11, 10 };
var result = new List<List<int>>();
foreach(var i in data.OrderBy(x => x)) {
var gr = result.FirstOrDefault(x => x.Min() - 1 <= i && i <= x.Max() + 1);
if(gr == null) {
result.Add(new List<int> { i });
} else {
gr.Add(i);
}
}
}
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38489272
Tamozhnya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private void rr() {
    var data = new List<int> { 1, 3, 2, 12, 6, 11, 10 };
    var result = new List<List<int>>();
    foreach(var i in data.OrderBy(x => x)) {
        var gr = result.FirstOrDefault(x => x.Min() - 1 <= i && i <= x.Max() + 1);
        if(gr == null) {
            result.Add(new List<int> { i });
        } else {
            gr.Add(i);
        }
    }
} 
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38489286
qilq1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var numbers = new int[] { 1, 3, 2, 12, 6, 11, 10 };
			var last = 22;
			numbers.OrderBy(x => x).Select(tt =>
			{
				if (last + 1 != tt) Console.WriteLine("");
				Console.WriteLine(tt + " ");
				last = tt;
				return tt;
			}).ToList();
...
Рейтинг: 0 / 0
[Задача] Группировка чисел
    #38489287
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КLINQ не нужен :-)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
            var src = new[] { 1, 3, 2, 12, 6, 11, 10 };

            var result = new List<List<int>>();

            foreach (var item in src.OrderBy(v => v))
            {
                if (result.Count > 0)
                {
                    var lastGroup = result[result.Count - 1];

                    if (lastGroup[lastGroup.Count - 1] == item - 1)
                    {
                        lastGroup.Add(item);
                        continue;
                    }
                }

                result.Add(new List<int> { item });
            }




pationНахлобуч,
как-то так
Код: c#
1.
2.
3.
4.
5.
6.
int[] array = { 14, 1, 3, 15, 2, 10, 6, 9, 11, 8, 13 };
var ret = array.OrderBy(x => x)
                .Select((x, i) => new { X = x, G = x - i })
                .GroupBy(x => x.G)
                .Select(g => g.Select(v => v.X).ToArray())
                .ToArray();



Остальные либо неочевидные, либо тормозные (на больших объемах данных)
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / [Задача] Группировка чисел
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]