繁体   English   中英

Java中如何提取字符串中的所有整数并将其转换为指定的char值?

[英]How to extract all the integers from a string and convert it to a specified char value in Java?

问题陈述是查找字符串之间的数字并找到给定数字的适当字符。 具体来说,0代表'a',1代表'b',2代表'c'……以此类推。 然后26代表'a',27-'b',28-'c'......这样继续下去。

为了更好地理解:

Input String: ab1ab

Output: b

解释:字符串中有一个 integer 值 '1' 代表 'b'。

Input String 2: abcd00hdjhs1224

Output: ac

解释:有两个 integer 值 '00' 和 '1224' 分别代表 'a' 和 'c'。

我的解决方案的问题是,当我将 integer 值存储为 int 或 long 数据类型时,较大的值会引发 NumberFormatException。

克服这个问题的更好方法是什么? 不仅仅是一个编程问题,它是算法问题。 如何在不担心大数字或 BigInteger class 的情况下实现解决方案?

注意:如果出现多个整数,则整体被视为一个 integer 值。(这就是我出现问题的地方)

模运算是对加法和乘法的分配。 IE

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

到底有什么好处呢?

假设“abcdefgh”表示一个大数,其中 ah 是该数字的数字。 很明显:

  • 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; 
}     

注意:如果出现多个整数,则整体被视为一个 integer >值。(这就是我出现问题的地方)

这不是您不必保留整个 integer 的问题。

假设我给你 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);

我认为你只需要关心数字,读取数字,解析它们,然后重复。

这是 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++;
}

您没有提到数字的约束,也没有提到字符串长度的约束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM