Как попарно сложить целые числа из множества?
Допустим, у меня есть множество:
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(5);
set.add(6);
set.add(7);
set.add(8);
как попарно сложить числа до тех пор, пока не останется одно число? Например:
[1 2 3 4 5 6 7 8] [3 7 11 15] [10 26] [36]
Пожалуйста, подскажите, сломала всю голову.
Ответы (2 шт):
Создаем упорядоченный список list на основе вашего set, зацикливаемся до тех пор, пока в list более 1 элемента. Во внутреннем цикле for попарно складываем элементы. Если в list нечетное число элементов, то в последней итерации цикла в качестве второго слагаемого берем число 0:
List<Integer> list = new ArrayList<>(set);
System.out.println(list);
while (list.size() > 1) {
List<Integer> newList = new ArrayList<>();
for (int i = 0; i < list.size(); i += 2) {
int a = list.get(i);
int b = i + 1 < list.size() ? list.get(i + 1) : 0;
newList.add(a + b);
}
list = newList;
System.out.println(list);
}
На выходе:
[1, 2, 3, 4, 5, 6, 7, 8]
[3, 7, 11, 15]
[10, 26]
[36]
Скорее всего, данная задача на написание рекурсивной функции, которая выводила бы промежуточные суммы пар.
Также можно предположить, что данную задачу следует решать при помощи итераторов, а не доступа через индексы.
public static Set<Integer> sumPairs(Set<Integer> set) {
System.out.println(set);
if (set.size() < 2) {
return set;
}
Set<Integer> pairs = new LinkedHashSet<>();
for (Iterator<Integer> it = set.iterator(); it.hasNext();) {
Integer p1 = it.next();
if (it.hasNext()) {
p1 += it.next();
}
pairs.add(p1);
}
return sumPairs(pairs);
}
Тест:
System.out.println("Сумма: " + sumPairs(new TreeSet<>(Set.of(1, 2, 3, 4, 5, 6, 7, 8))));
[1, 2, 3, 4, 5, 6, 7, 8]
[3, 7, 11, 15]
[10, 26]
[36]
Сумма: [36]
Следует заметить, что в общем случае HashSet не гарантирует порядок элементов, и это может привести в некоторых случаях к "странным" результатам, поскольку промежуточные суммы будут дублироваться, например:
System.out.println("Сумма: " + sumPairs(Set.of(1, 2, 3, 4, 5, 6, 7, 8)));
[4, 5, 6, 7, 8, 1, 2, 3] // 4 + 5 == 8 + 1 - только одна девятка!
[9, 13, 5]
[22, 5]
[27]
Сумма: [27]
[2, 1, 8, 7, 6, 5, 4, 3]
[3, 15, 11, 7] // 3 + 15 == 11 + 7
[18]
Сумма: [18]
[1, 8, 2, 7, 4, 5, 6, 3]
[9]
Сумма: [9]