Группировать элементы списка по разнице - PullRequest
0 голосов
/ 05 октября 2018

Допустим, у меня есть список,

(1,2,4,6,7,8,10,23,34,35,67,69,70)

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

((1,2),(4),(6,7,8),(10),(23),(34,35),(67),(69,70))

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

Любой язык программирования подходит для решения, все, что я ищу, - это направление. Мне не нужно полное решение.Просто неполный псевдокод, который может помочь мне решить эту проблему быстрее, так как это очень маленькая часть того, что я пытаюсь сделать.Просто имя алгоритма тоже подойдет.:)

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Java не Ruby, но, надеюсь, это переводится довольно легко:

int[] arr = {1,2,4,6,7,8,10,23,34,35,67,69,70};

for(int i=1, j=0; i<=arr.length; i++)
{
  if(i == arr.length || arr[i]-1 != arr[i-1])
  {
    System.out.printf("%s ", Arrays.toString(Arrays.copyOfRange(arr, j, i)));
    j = i;
  }
}

Вывод:

[1, 2] [4] [6, 7, 8] [10] [23] [34, 35] [67] [69, 70] 
0 голосов
/ 05 октября 2018

Хорошо, я думаю, что решил это.Но все еще кажется мне безобразным.Я использовал Ruby,

array = [1,2,4,6,7,8,10,23,34,35,67,69,70]

last_index_before = array.size - 1
arr = []

# Can not use map because of the break maybe?
(0..last_index_before).each do |_|
  element = array.delete_at(0)
  break if element.nil? # We reached the end
  results = [element]

  next_element = array[0]
  while !next_element.nil? && (next_element - element) <= 1
    results << array.delete_at(0)
    element = next_element
    next_element = array[0]
  end
  arr << results
end

p arr

Выход,

[[1, 2], [4], [6, 7, 8], [10], [23], [34, 35], [67], [69, 70]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...