如何从字符串中提取所有整数并将其转换为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
说明:字符串中有一个整数值'1'代表'b'.
Input String 2: abcd00hdjhs1224
Output: ac
说明:有两个整数值'00'和'1224'分别代表'a'和'c'。
我的解决方案的问题是,当我将整数值存储为 int 或 long 数据类型时,大值会抛出 NumberFormatException。
解决这个问题的更好方法是什么?不仅仅是编程问题,它还是算法问题。如何在不担心大数或 BigInteger class?
的情况下实现解决方案
注意:如果出现多个整数,则整体被视为一个整数值。(这就是我出现问题的地方)
Note: If multiple integers occur then the whole is considered as one integer >value.(That is where the problem occurs for me)
这不是你不必保留整个整数的问题。
假设我给你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++;
}
你没有提到数字的限制,也没有提到你的字符串长度的限制。
模运算对加法和乘法是分配的。即
- (A+B)%n = (A%n + B%n)%n
- (A*B)%n = (A%n * B%n)%n
它有什么用?
假设 "abcdefgh" 代表一个大数字,其中 a-h 是该数字的数字。很明显:
- 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代表'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 class?
的情况下实现解决方案注意:如果出现多个整数,则整体被视为一个整数值。(这就是我出现问题的地方)
Note: If multiple integers occur then the whole is considered as one integer >value.(That is where the problem occurs for me)
这不是你不必保留整个整数的问题。
假设我给你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++;
}
你没有提到数字的限制,也没有提到你的字符串长度的限制。
模运算对加法和乘法是分配的。即
- (A+B)%n = (A%n + B%n)%n
- (A*B)%n = (A%n * B%n)%n
它有什么用?
假设 "abcdefgh" 代表一个大数字,其中 a-h 是该数字的数字。很明显:
- 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;
}