@noteblock

Как сортировать массив на основе суммы элементов?

Дано: массив, состоящий из чисел 1 и 2.
Что нужно: Я строю сетку элементов. Бывает ситуация, когда «не ок»:

81f5e5ac822f40ccba297c1b11889599.png

Для этого сортирую элементы массива в новый массив группами так, чтобы сумма элементов в группе была равна 4. Соответственно, порядок элементов массива должен быть максимально близким к изначальному —меняться местами должны лишь некоторые элементы.

Основную часть кода (JS) я написал, однако есть баг, с которым не могу справиться:
например, для массива [1,1,2,1,1,2,1,2,2,2] - отрабатывает до выделенного момента, затем - бесконечный цикл.

Мой говнокод:
arr = [1,1,2,1,1,2,1,2,2,2];
var summ = 0;
var rowsCounter = 0;
var rows = []; // финальный массив
function arraySort(){
	for (var i = 0; i < arr.length; i++) {
		summ += arr[i];
		if (summ > 4){
			for (var x = i; x < arr.length; x++) {
				if (summ - arr[x] == 4){
					temp = arr[i];
					arr[i] = arr[x];
					arr[x] = temp;
					summ = 4;
					break;
				} else {
					continue;
				}
			}
		}
		if (summ == 4){
			rows.push(arr.slice(0, i + 1));
			arr.splice(0, i + 1);
			summ = 0;
			break;
		}
	};
}

while (arr.length > 0){
	arraySort();
}

console.log(rows)


Видимо, остающихся небольших массивах, для которых нужно какое-то исключение?
Т.к. например, массив [1,2,2] просто дробится на [2] [1] [2]

Эни хэлп, гайз!
  • Вопрос задан
  • 781 просмотр
Решения вопроса 1
Adamos
@Adamos
Если нужно всего лишь собрать единички и двойки в группы с суммой 4, то:
0. Подсчитываем количество единиц и двоек.
1. Все двойки собираем в пары.
2. Если одна осталась - присобачиваем к ней две единицы, если они есть.
3. Все оставшиеся единицы собираем по четыре.
Все. Никаких вложенных циклов, рекурсий и прочего тут тупо не нужно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
Вот причина вашего бесконечного цикла.
while (arr.length > 0){
  arraySort();
}
Вы на вход подаете элементы, полная сумма который равна пятнадцати. Как бы вы не старались, их нельзя поделить нацело на 4 без остатка. А остаток вы не предусмотрели.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы