#arrays #collections
#массивы #Коллекции
Вопрос:
Пример массива:
[
1, 2, 3, 10, 11, 12, 13, 14, 20, 21, 22, 30
]
Мне нужно, чтобы он разделился на три части с близкими значениями
[1, 2, 3]
[10, 11, 12, 13, 14]
[20, 21, 22, 30]
Массив может быть разным, но логика одна и та же. Может ли кто-нибудь предложить какой-либо подход (математическую модель, теорию, распределение или и т. Д.) Для этого?
Комментарии:
1. Под «близкими» значениями вы подразумеваете последовательные, я предполагаю. Должны ли числа быть в порядке внутри массива или вы могли бы иметь [1,9,2,3,8] и возвращать [1,2,3] и [8,9] ?
2. Нет, массив всегда сортируется по asc
3. Начните с первого элемента, N, и посмотрите, равен ли следующий элемент N 1. Если это произойдет, добавьте его в массив. Если нет, поместите это число в новый массив и повторите. (вы можете использовать 2D-массив для создания этого)
Ответ №1:
Термин «разделить массив с близкими значениями» неоднозначен.
Вы можете проверить, находится ли разница между двумя последовательными значениями в определенном диапазоне. Если разница находится в указанном диапазоне, то вы можете добавить текущее значение в текущий вложенный список. Еще вам нужно добавить в следующий список:
prev = 0
cnt = 1
for elm in A:
if elm - prev not in range(0, 5):
cnt = 1
add_to_sub(cnt, elm)
prev = elm
cnt
переменная используется для определения, в какой подсписок мы должны добавить значение. Для вопроса я установил диапазон между 0-5. Это означает, что если разница больше или равна 5, добавьте текущее значение в следующий вложенный список.
Код:
A = [1, 2, 3, 10, 11, 12, 13, 14, 20, 21, 22, 30]
sub1 = []
sub2 = []
sub3 = []
prev = 0
cnt = 1
def add_to_sub(count, element):
if count == 1:
sub1.append(element)
elif count == 2:
sub2.append(element)
else:
sub3.append(element)
for elm in A:
if elm - prev not in range(0, 5):
cnt = 1
add_to_sub(cnt, elm)
prev = elm
print(sub1)
print(sub2)
print(sub3)
Результат:
[1, 2, 3]
[10, 11, 12, 13, 14]
[20, 21, 22, 30]
Ответ №2:
Поскольку все значения в исходном массиве уже отсортированы, это упрощает задачу.
В вашем примере я скажу, что есть 3 решения.
solution 1: [1, 2, 3]
solution 2: [10, 11, 12, 13, 14]
solution 3: [20, 21, 22, 30]
Каждое решение представляет собой массив. Мы будем использовать другой массив для хранения всех этих решений. Если ваш исходный массив не пуст, у вас будет как минимум 1 решение, содержащее как минимум 1 значение.
Возьмите первое значение из источника и начните создавать решение 1. Теперь перебираем оставшиеся значения в источнике. Если следующее значение следует за самым последним значением, добавленным в текущем решении, добавьте его в этот набор решений. Если нет, начните создавать новое решение.
source = [1, 2, 3, 10, 11, 12, 13, 14, 20, 21, 22, 30];
solutions = new Array(1);
index = 0;
solutions[index] = new Array();
solutions[index].push(source[0]);
j = 0;
for (i = 1; i < source.length; i ){
if (solutions[index][j] 1 == source[i]){
solutions[index].push(source[i]);
j
}else{
solutions.push(new Array());
index ;
solutions[index].push(source[i]);
j = 0;
}
}
console.log(solutions);