Как преобразовать int значение 09 в массив символов как {'0', '9'}? - PullRequest
0 голосов
/ 27 марта 2020

Я работаю над проблемой, чтобы найти следующее наибольшее число с тем же набором цифр.

Для этого я беру целочисленное значение, введенное пользователем, и хочу преобразовать его в массив char или int array так что я могу получить доступ к отдельным цифрам.

Но когда я принимаю

int value = 09 в качестве входных данных и преобразую в массив символов, он дает только 9, так как считает его восьмеричным ценность. Как я могу преодолеть это?

Ответы [ 5 ]

0 голосов
/ 28 марта 2020

Вы спрашиваете, как разобрать число, начинающееся с начального нуля, но я чувствую, что вы на самом деле на пути к работе, учитывая проблему, которую вы пытаетесь решить. Итак, давайте сделаем шаг назад и убедимся, что я правильно понимаю вашу проблему.

Вы говорите, что вам нужно найти «следующее наибольшее число с тем же набором цифр». Таким образом, вы играете в «Скрэббл» с цифрами, пытаясь найти самое маленькое число, состоящее из тех же цифр, которые строго больше исходного числа. Например, учитывая вход «09», вы выведите «90», а «123» выведите «132». Это правильно? Давайте предположим, что так.

Теперь реальная задача здесь состоит в том, как определить самое маленькое число, составленное из этих цифр, которое значительно больше исходного числа. На самом деле, есть несколько возможных стратегий:

  1. Перечислите все возможные перестановки этих цифр, затем отфильтруйте те, которые не строго больше исходного числа, а затем, среди оставшихся значений, найдите наименьшее ценность. Это была бы очень неэффективная стратегия, требующая как непропорциональной памяти, так и вычислительной мощности. Пожалуйста, не принимайте это всерьез (то есть, если вы на самом деле не кодируете Quantum Computer ;)).
  2. Установите переменную в начальное число, затем итеративно увеличивайте эту переменную по одному, пока в итоге вы не получите число, состоящее из тех же цифр, что и исходные значения. Это может показаться простым в реализации, но на самом деле оно скрывает некоторые сложности (т. Е. Определение того, что два числа составлены из одних и тех же цифр, не является тривиальным , потребуется специальная обработка, чтобы избежать бесконечной l oop, если начальное число на самом деле является наибольшим значением, которое может быть сформировано из этих цифр). В любом случае, эта стратегия также будет довольно неэффективной, требующей значительной вычислительной мощности.
  3. Перебирайте сами цифры и точно определяйте, какие цифры нужно поменять местами / переупорядочить, чтобы получить следующее число. Это на самом деле очень просто реализовать (я просто написал это менее чем за 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);
}

Надеюсь, это поможет.

0 голосов
/ 27 марта 2020

Невозможно присвоить целое число с ведущим 0 переменной int, например, int x = 09; не удастся скомпилировать. Вам необходимо получить входные данные как String и обработать их.

например

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String strNum;
        boolean valid;
        do {
            valid = true;
            System.out.print("Enter an integer: ");
            strNum = in.nextLine();
            if (!strNum.matches("\\d+")) {
                System.out.println("This is an invalid input. Please try again.");
                valid = false;
            }
        } while (!valid);
        char[] charArr = strNum.toCharArray();
        System.out.println(Arrays.toString(charArr));

        // An example of processsing the digits
        System.out.println("Digit after incrementing them by 10 are: ");
        for (char ch : charArr) {
            System.out.println(ch - 48 + 10);// ASCII values of '0' to '9' are from 48 to 57
        }
    }
}

Пример выполнения:

Enter an integer: abc
This is an invalid input. Please try again.
Enter an integer: a
This is an invalid input. Please try again.
Enter an integer: 10.3
This is an invalid input. Please try again.
Enter an integer: 09
[0, 9]
Digit after incrementing them by 10 are: 
10
19
0 голосов
/ 27 марта 2020

в java невозможно получить значения типа int с ведущими нулями. поэтому для значения с начальными нулями возьмите его в строковом формате.

, но мы можем вставить нули

int n = 7;
String str = String.format ("% 04d ", n); // 4 обозначает размер строки
System.out.println (str); // o / p-> 0007

0 голосов
/ 27 марта 2020

Поскольку ведущие 0 удаляются из целых чисел, нет причин поддерживать присвоение такого значения целому.

Если я хочу преобразовать 9 в '9', я обычно просто добавляю '0' в it.

Вы также можете сделать следующее:

char c = Character.forDigit(9,10);

Если у вас есть строка символов, вы можете сделать следующее:

        String str = "09";
        List<Character> chrs =
                str.chars().mapToObj(a -> Character.valueOf((char) a))
                        .collect(Collectors.toList());
        System.out.println(chrs);

Печать

[0,9]
0 голосов
/ 27 марта 2020

Невозможно преобразовать значение 09 int в строку 9, поскольку значение 09 не может быть сохранено в int.

int не может хранить конечные нули.

Взять этот образец.

int foo = Integer.valueOf("09");
System.out.println(foo);

Выход

9

Итак, чтобы решить вашу проблему, вы должны получить от пользователя String, проверить его и проанализировать до Integer[].

Решение

public Integer[] parseToInteger(String number) {
    return Arrays.asList(number.toCharArray())
        .stream()
        .map(c -> Integer.valueOf(c.toString()))
        .toArray(size -> new Integer[size]);
}

Теперь у вас есть Array из Integer.

...