Постановка задачи :: В Java, учитывая массив целых чисел, можно выбрать группу из нескольких целых чисел, такую, чтобы эта сумма суммировалась с заданной целью, с этим дополнительным ограничением: если в числах есть числа массив, который является смежным и идентичным значением, они должны или все быть выбраны, или ни один из них не выбран. Например, с массивом {1, 2, 2, 2, 5, 2} должны быть выбраны либо все три 2 в середине, либо нет, все как группа. (один цикл можно использовать для определения степени одинаковых значений).
groupSumClump(0, {2, 4, 8}, 10) → true
groupSumClump(0, {1, 2, 4, 8, 1}, 14) → true
groupSumClump(0, {2, 4, 4, 8}, 14) → false --> Failing Test Case
groupSumClump(0, {8, 2, 2, 1}, 9) → true --> Failing Test Case
groupSumClump(0, {8, 2, 2, 1}, 11) → false --> NegativeArraySizeException
Я провел некоторый начальный анализ, а частичный код такой, как показано ниже.
public boolean groupSumClump(int start, int[] nums, int target) {
start = 0;
boolean flag = false;
// get the highest int from the list of array we have
int highestInteger = getTheBiggest(nums);
if (highestInteger > target) {
flag = false;
} else {
int variable = 0;
for (int i = 0; i < nums.length; i++) {
variable += nums[i];
}
if (variable == target) {
flag = true;
} else {
if (variable < target) {
flag = false;
} else {
// here goes ur grouping logic here
flag = summate(highestInteger, target, nums);
}
}
}
return flag;
}
private boolean summate(int highestInteger, int target, int[] nums) {
boolean val = false;
if (highestInteger == target) {
val = true;
} else {
int[] temp = new int[nums.length - 1];
int var = 0;
if ((target - highestInteger) > 0) {
for (int j = 0; j < nums.length-1; j++) {
if (nums[j] != highestInteger) {
temp[var] = nums[j];
if (temp[var] == (target - highestInteger)) {
val = true;
return val;
}
var++;
}
}
val = summate(getTheBiggest(temp), target - highestInteger,
temp);
}
}
return val;
}
private int getTheBiggest(int[] nums) {
int biggestInteger = 0;
for (int i = 0; i < nums.length; i++) {
if (biggestInteger < nums[i]) {
biggestInteger = nums[i];
}
}
return biggestInteger;
}
Обратите внимание: я не знаю, как обращаться с логикой для постановки задачи ниже:
Существует проблема Additional Constraint
, заключающаяся в том, что если в массиве есть соседние числа и одинаковое значение, все они должны быть либо выбраны, либо ни один из них не выбран. Например, с массивом {1, 2, 2, 2, 5, 2} должны быть выбраны либо все три 2 в середине, либо нет, все как группа. (один цикл можно использовать для определения экстента одинаковых значений).
как мне справиться с этой частью логики в вышеуказанной проблеме.
Я изо всех сил пытался получить это право без понятия.
Предложения будут оценены.
Не могли бы вы сообщить мне, в чем проблема с кодом / как справиться с дополнительным ограничением в этой проблеме: - ((
Дополнительное ограничение говорит, что либо вы выбираете в качестве группы, но не выбираете в качестве группы. Поэтому я не знаю, как поступить. Если вы можете ПОЖАЛУЙСТА, помогите мне. Это будет оценено.
РЕДАКТИРОВАТЬ ДЛЯ ПОЛЬЗОВАТЕЛЯ-> MISSINGNO: Я добавил приведенную ниже конструкцию кода к приведенному выше основному коду, и она выводит мне неправильные значения. Где я ошибся.
groupSumClump (0, {2, 4, 4, 8}, 14) → false снова не работает
2
8
4
Флаг -> true, что неверно.
for(int number=0;number<nums.length-1;number++){
if(nums[number]==nums[number+1]){
nums[number]=nums[number]+nums[number+1];
}
}