2015-10-26 2 views
-2

Если у меня есть целочисленный массив переменной длины [n], можно итератировать его так, чтобы каждое значение увеличивалось только тогда, когда следующее значение достигло n-1.Итерационные значения в массиве

, например, если п = 3:

int[] intArray = {0, 0, 0}; 

приращение INTArray [], что:

intArray = {0, 0, 1} 
intArray = {0, 0, 2} 
intArray = {0, 1, 0} 
intArray = {0, 1, 1} 
intArray = {0, 1, 2} 
intArray = {0, 2, 0} 
intArray = {0, 2, 1} 
intArray = {0, 2, 2} 
intArray = {1, 0, 0} 
intArray = {1, 0, 1} 
... 
intArray = {2, 2, 2} 

ответ

4

Это помогает думать шаблонов в ваших проблем - иногда они предлагают общие решения, которые могут быть просто сломать и реализовать.

В этом случае содержимое массива действует как базовые числа n (базовый-3 в конкретном примере). Таким образом, вы можете рассмотреть алгоритм для увеличения произвольной числовой базы, и как только вы перейдете к его кодированию.

Функция, которая будет «увеличивать» номер базы-n, начнется путем увеличения младшей значащей цифры и проверки ее на переполнение. В базе 10 мы сохраним 0 и переносим 1 на следующую наиболее значимую цифру. В произвольной числовой базе это то же самое, что сброс цифры до нуля и увеличение следующей наиболее значимой цифры.

Есть особые случаи рассмотрения. Что делать, если вас попросят увеличить «maxint» в вашей числовой базе, например. {2, 2, 2}? Вы добавите еще одну значащую цифру? Вы привяжете значение в «maxint» или оберните до 0? Вы сделаете исключение? Нет «правильного» ответа, если у вас уже нет спецификации.

В псевдокоде, вот идея:

increment(digits , base) { 
for (place=digits.length - 1; place >= 0; place--) { 
    digit = digits[place]++; // increment digit in this place 
    if (digit < base) 
    break; 
    else 
    digit = 0; // overflowed, so "wrap" to zero, increment next place 
} 
return digits; 
} 
+0

работал отлично с небольшим пустячный, модуль [здесь] (http://pastebin.com/eb9Z0brT), если кто нуждается в этом. – Dystar