[英]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
到底有什么好处呢?
假设“abcdefgh”表示一个大数,其中 ah 是该数字的数字。 很明显:
由于您只对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.