я в настоящее время работаю над следующим вопросом из интервьюирования книги:Java найти все комбинации в массиве, которые добавляют до определенного числа
вам дает случайный массив из 50 уникальных целых чисел в диапазоне от 1 до 100 включительно. Напишите метод с использованием Java, который принимает положительное целое число как параметр и возвращает массив всех комбинаций чисел, которые добавляют к этому значению.
Например, если задан массив целых чисел [3,6,1,9,2,5,12] и передано целочисленное значение 9, вы должны вернуть [[3,6], [6, 1,2], [9], [3,1,5]]. Порядок возврата результатов в массив не имеет значения, хотя вы должны возвращать уникальные наборы (т. Е. [6,3] и [3,6] являются одинаковыми, и только один должен быть возвращен). Кроме того, отдельные результаты должны быть в том порядке, в котором они найдены (т.е. [6,1,2] должны быть возвращены, а не [1,2,6]).
Я достиг достойного прогресса, но я боюсь, что смогу решить это неправильно.
import java.util.*;
public class findCombinations {
public static void main(String[] args) {
int number;
int[] list = new int[10];
Scanner reader = new Scanner(System.in);
//fill the array
for (int i = 0; i < list.length; i++) {
number = (int)(Math.random() * 10) + 1;
list[i] = number;
for (int j = 0; j < i; j++) { //remove duplicates
if (list[i] == list[j]) {
i--;
break;
}
}
}
Arrays.sort(list);
//test output
for (int i = 0; i < list.length; i++) {
System.out.println(list[i]);
}
System.out.println("Enter a number: ");
int input = reader.nextInt();
ArrayList<Integer> trimmedList = new ArrayList<Integer>();
//cut out the numbers that are impossible to use
for (int i = 0; i < list.length; i++) {
if (list[i] <= input) {
trimmedList.add(list[i]);
}
}
//test output
printList(trimmedList);
ArrayList<Integer> comboList = new ArrayList<Integer>();
System.out.println("Finding combinations...");
for (int i = 0; i < trimmedList.size(); i++) {
int current = trimmedList.get(i);
if (current == input) { System.out.println(current); }
else if (current < input) {
comboList.add(current);
if (isCombo(comboList, input)) {
printList(comboList);
}
else { continue; }
}
else { continue; }
}
}
public static boolean isCombo(ArrayList<Integer> list, int input) {
ArrayList<Integer> combo = new ArrayList<Integer>();
int sum = 0;
for (int i : list)
sum += i;
if (sum == input) { return true; }
else { return false; }
}
public static void printList(ArrayList<Integer> list) {
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));
}
}
}
Я знаю, что это неполное, но я хотел бы спросить, если кто-либо имели какие-либо предложения или улучшение я мог бы сделать по этому поводу? Я отсортировал список и укоротил все целые числа, которые не будут использоваться, но теперь сложная часть находит все комбо.
Все упражнение состоит в том, чтобы узнать, знаете ли вы, как создавать все под-списки списка. Итак, вы еще не начали. –
Пожалуйста, удалите 'else {continue; } ' – freedev
Эта ссылка, вероятно, поможет вам. http://codereview.stackexchange.com/questions/36214/find-all-subsets-of-an-int-array-whose-sums-equal-a-given-target – panaroma