Вы спрашиваете, как разобрать число, начинающееся с начального нуля, но я чувствую, что вы на самом деле на пути к работе, учитывая проблему, которую вы пытаетесь решить. Итак, давайте сделаем шаг назад и убедимся, что я правильно понимаю вашу проблему.
Вы говорите, что вам нужно найти «следующее наибольшее число с тем же набором цифр». Таким образом, вы играете в «Скрэббл» с цифрами, пытаясь найти самое маленькое число, состоящее из тех же цифр, которые строго больше исходного числа. Например, учитывая вход «09», вы выведите «90», а «123» выведите «132». Это правильно? Давайте предположим, что так.
Теперь реальная задача здесь состоит в том, как определить самое маленькое число, составленное из этих цифр, которое значительно больше исходного числа. На самом деле, есть несколько возможных стратегий:
- Перечислите все возможные перестановки этих цифр, затем отфильтруйте те, которые не строго больше исходного числа, а затем, среди оставшихся значений, найдите наименьшее ценность. Это была бы очень неэффективная стратегия, требующая как непропорциональной памяти, так и вычислительной мощности. Пожалуйста, не принимайте это всерьез (то есть, если вы на самом деле не кодируете Quantum Computer ;)).
- Установите переменную в начальное число, затем итеративно увеличивайте эту переменную по одному, пока в итоге вы не получите число, состоящее из тех же цифр, что и исходные значения. Это может показаться простым в реализации, но на самом деле оно скрывает некоторые сложности (т. Е. Определение того, что два числа составлены из одних и тех же цифр, не является тривиальным , потребуется специальная обработка, чтобы избежать бесконечной l oop, если начальное число на самом деле является наибольшим значением, которое может быть сформировано из этих цифр). В любом случае, эта стратегия также будет довольно неэффективной, требующей значительной вычислительной мощности.
- Перебирайте сами цифры и точно определяйте, какие цифры нужно поменять местами / переупорядочить, чтобы получить следующее число. Это на самом деле очень просто реализовать (я просто написал это менее чем за 5 минут), но сначала нужно немного подумать. Алгоритм O (n log n), где n - длина номера (в цифрах). Возьмите лист бумаги, напишите примерные числа в столбцах и попытайтесь понять логику c за ним. Это определенно путь к go.
Все три стратегии имеют одну общую черту: все они требуют, чтобы вы работали (в какой-то момент по крайней мере) с цифрами чем с самим номером. В последней стратегии вы фактически никогда не нуждаетесь в реальной стоимости. Вы просто играете в Scrabble с цифрами, а не с буквами.
Итак, если вы действительно хотите реализовать стратегию 3, вот как может выглядеть ваш метод main
(я не буду более подробно останавливаться на этом, комментарии должны достаточно далеко):
public static void main(String[] args) {
// Read input number and parse it into an array of digit
String inputText = readLineFromUser();
int[] inputDigits = parseToDigits(inputText);
// Determine the next greater number
int[] outputDigits = findNextGreaterNumber(inputDigits);
// Output the resulting value
String outputText = joinDigits(outputDigits);
println(outputText);
}
Итак, вот смысл всей этой дискуссии: метод parseToDigits
принимает String
и возвращает массив цифр (здесь я использовал int
, чтобы упростить задачу , но byte
на самом деле было бы достаточно). Таким образом, в основном вы хотите взять символы входной строки и преобразовать этот массив в массив целых чисел, где каждая позиция на выходе содержит значение соответствующего di git на входе. Это может быть написано по-разному в Java, но я думаю, что самое простое будет с простым for
l oop:
public static int[] parseToDigits(String input) {
char[] chars = input.toCharArray();
int[] digits = new int[chars.length];
for (int i = 0 ; i < chars.length ; i++)
digits[i] = Character.forDigit(chars[i], 10);
return digits;
}
Обратите внимание, что Character.forDigit(digit, radix)
возвращает значение символа digit
в базе radix
; если digit
недопустимо для данной базы, forDigit
возвращает 0
. Для простоты я пропускаю правильную проверку проверки здесь. Можно было бы сначала вызвать Character.isDigit(digit, radix)
, чтобы определить, является ли di git приемлемым, и, если нет, вызвать исключение.
Что касается противоположной операции, joinDigits
, это будет выглядеть так:
public static String joinDigits(int[] digits) {
char[] chars = new char[digits.length];
for (int i = 0 ; i < digits.length ; i++)
chars[i] = Character.digit(digits[i], 10);
return new String(chars);
}
Надеюсь, это поможет.