Как извлечь все целые числа из строки и преобразовать ее в указанное значение символа в Java? - PullRequest
0 голосов
/ 24 сентября 2019

Задача состоит в том, чтобы найти числа между строкой и найти соответствующий символ для данного числа.Чтобы быть точным, 0 представляет «a», 1 представляет «b», 2 представляет «c» ... и так далее.И затем снова 26 представляет «a», 27- «b», 28- «c» .... продолжается следующим образом.

Для лучшего понимания:

Input String: ab1ab

Output: b

Объяснение:в строке есть одно целочисленное значение «1», которое представляет «b».

Input String 2: abcd00hdjhs1224

Output: ac

Объяснение: есть два целочисленных значения «00» и «1224», которые представляют «a» и «c» соответственно.

Проблема с моим решением состояла в том, что когда я сохранял целочисленные значения в типе данных int или long, большие значения вызывали NumberFormatException.

Каким был бы лучший подход для решения этой проблемы?Больше, чем проблема программирования, это алгоритмическая проблема.Как я могу достичь решения, не беспокоясь о большом числе или классе BigInteger?

Примечание: если встречается несколько целых чисел, то целое рассматривается как одно целочисленное значение (вот где проблема возникает для меня)

Ответы [ 3 ]

3 голосов
/ 24 сентября 2019

Операция модуля является распределительной по сложению и умножению.т.е.

  • (A + B)% n = (A% n + B% n)% n
  • (A * B)% n = (A% n * B%n)% n

Для чего это нужно?

Предположим, что "abcdefgh" представляет большое число, где ах - цифры этого числа.Очевидно, что:

  • abcdefgh = (abcde * 1000 + fgh) или
  • abcdefgh = (a * 10000000 + bcdefgh) или
  • abcdefgh = (a* 10000000 + b * 1000000 + c * 100000 + d * 10000 + e * 1000 + f * 100 + g * 10 + h)

Поскольку вас интересуют только значения yourDigits%26Вы можете отсканировать каждое число, найденное во входной строке слева направо, умножить на 10, добавить следующее число и взять по модулю и сохранить его как новый ответ, пока не достигнете конца строки:

public static void main(String[] args) { 
    System.out.println(mapNumbersToCharsAndConcat("ab1ab"));
    System.out.println(mapNumbersToCharsAndConcat("abcd00hdjhs1224"));
}
static String mapNumbersToCharsAndConcat (String input){
    char[] myChars = "abcdefghijklmnopqrstuvwxyz".toCharArray();
    StringBuilder sb = new StringBuilder();       
    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher(input);
    while(m.find()){
        String num = m.group();
        sb.append(myChars[modFromString(num)]);
    }
    return sb.toString();
}
static int modFromString(String num){
    int res = 0;   
    for (int i = 0; i < num.length(); i++){
        res = (res * 10 + (int)num.charAt(i) - '0') % 26; 
    }
    return res; 
}     
0 голосов
/ 24 сентября 2019

Я думаю, вам нужно заботиться только о цифрах, читать цифры, анализировать их, а затем повторять.

Это O (N) сложность времени.

Ваш алгоритм будет выглядеть так:

String chars = "abcdefghijklmnopqrstuvwxyz";
String str = "abcd00hdjhs1224";
StringBuilder result = new StringBuilder();
int index = 0;
while (index < str.length()) {
     StringBuilder number = new StringBuilder();
     int charIndex = -1;
     while (index < str.length() && Character.isDigit(str.charAt(index))) {
            number.append(str.charAt(index));
            index++;
        }

        if (!number.toString().isEmpty()){
            charIndex = Integer.parseInt(number.toString()) % 26;
        }

     if (charIndex != -1){
         result.append(chars.charAt(charIndex));
     }
     index++;
}

Вы не упомянули ни ограничение цифр, ни ограничение длины вашей строки.

0 голосов
/ 24 сентября 2019

Примечание: если встречается несколько целых чисел, то целое рассматривается как одно целое число> (вот где проблема возникает для меня)

Это не та проблема, которую вы не задаетенужно сохранить целое целое число.

Предположим, я дам вам 1872368486184712442 и попрошу вас разделить на 26, что вы будете делать?

Да, именно это является ключевым моментом для решения этой проблемы.

вот простой фрагмент кода

String ans="",s1="1abb00hjsdj";
for(int i=0;i<s1.length();i++){
  if(s1.charAt(i)>='0' && s1.charAt(i)<='9'){
    int num=0;
    while(i<s1.length() && s1.charAt(i)>='0' && s1.charAt(i)<='9'){
      num=(num*10+s1.charAt(i)-'0')%26;
      i++;
    }
    ans=ans+Character.toString((char)('a'+num));
  } else {
    continue;
  }
}
System.out.println(ans);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...