Я делаю простую сложную математическую игру, и мне было интересно, как реализовать следующее:
Скажем, у меня есть этот массив:
int[] numbers = { 9, 2, 1, 1, 2, 9 };
и я хотите, чтобы пользователь вставил значение, скажем, 2
где-нибудь в массиве, чтобы набор последовательно помещенных чисел в массиве , включая вновь помещенное значение , складывалось в целевое значение, скажем, 8
. Я назову эту комбинацию чисел combo .
Я хочу, чтобы пользователь мог разместить 8 в любом месте этого массива. поскольку 2 + 1 + 1 + 2 = 6
пользователь должен иметь возможность разместить его где-нибудь между этими внешними 9
.
Правильное размещение может быть, например, {9, 2, *2*, 1, 1, 2, 9}
или {9, *2*, 2, 1, 1, 2, 9}
.
Теперь проблема, с которой я сталкиваюсь, заключается в том, что я могу заставить его работать, только когда вы поместите 2
на внешние стороны комбо, как во втором примере выше этого параграфа, а не как в первом.
Я делаю это следующим образом:
- Поиск значения из массива в
startIndex
- Добавление этого значения в
currentSum
- См., Если
currentSum == targetValue
: комбо найдено - Иначе, если
currentSum > targetValue
: комбо не найдено - Остальное установлено
startIndex += 1
(или -1, если размещено в другой конец) и повторите
Но это решает проблему только тогда, когда вновь размещенное значение находится на внешних границах комбо.
Я понимаю, что могу перебрать силу обойти эту проблему, сложив каждое содержимое каждого потенциального подмассива, содержащего вновь размещенное значение, а затем увидев если один из них добавляет к целевому значению 8
, но я ищу что-то более элегантное.