如何仅反转字符串中的数字

how to reverse only numbers in a string

输入:123ABC458 输出:321ABC854

public static void main(String []args){
    String str="123ABC564";
    int count=0;
    int ans=0;
    int firstindex=0;
    char[] ch = str.toCharArray();
    for(int i=0;i<ch.length;i++){
        if(Character.isDigit(ch[i])){
            if(ans==0){
                firstindex=i;

            }
            count++;
        }
        else{
            int lastindex=count+firstindex-1;
            while(firstindex<lastindex){
                char temp=ch[firstindex];
                ch[firstindex]=ch[lastindex];
                ch[lastindex]=temp;
                firstindex++;
                lastindex--;
            }
            ans=0;
            count=0;
            firstindex=0;
        }
    }
    for (char c : ch){
        System.out.print(c);
    }
}

}

谁能告诉我这段代码有什么问题 我使用这段代码得到的输出是 12BA3C564


这是使用字符串拆分的简洁版本:

String input = "123ABC458";
String[] parts = input.split("(?<=\D)(?=\d)|(?<=\d)(?=\D)");
StringBuilder sb = new StringBuilder();
for (String part : parts) {
    if (part.matches("\d+")) {
        StringBuilder num = new StringBuilder(part);
        sb.append(num.reverse());
    }
    else {
        sb.append(part);
    }
}

System.out.println(sb.toString());  // 321ABC854

上面使用的拆分操作生成了一个由数字或字母组成的字符串数组。然后,我们迭代该数组并使用 StringBuilder#reverse.

有选择地反转数字字符串

您可以使用Java regex APIStringBuilder轻松解决。正则表达式 \d+ 指定一位或多位数字。使用 Java 正则表达式 API,您可以找到可用于构建所需字符串的数字、它们的开始位置和结束位置。

演示:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        // Tests
        String[] samples = { "123ABC458", "123ABC458XYZ", "123ABC458XYZ367", "ABC123XYZ", "ABC123XYZ" };
        for (String s : samples)
            System.out.println(numbersInverted(s));

    }

    static String numbersInverted(String str) {
        StringBuilder sb = new StringBuilder();
        Matcher matcher = Pattern.compile("\d+").matcher(str);
        int lastInitialPos = 0;
        while (matcher.find()) {
            int start = matcher.start();
            String inverted = new StringBuilder(matcher.group()).reverse().toString();
            sb.append(str.substring(lastInitialPos, start)).append(inverted);
            lastInitialPos = matcher.end();
        }
        if (sb.length() == 0) // If no number was found
            return str;
        else
            return sb.append(str.substring(lastInitialPos)).toString();
    }
}

输出:

321ABC854
321ABC854XYZ
321ABC854XYZ763
ABC321XYZ
ABC321XYZ

ONLINE DEMO

第一步可以把字符串中的所有数字都取出来,然后用数字反转的字符串替换输入。示例:

public static void main(String[] args)
{
    String input = "123ABC458";
    Matcher m = Pattern.compile("\d+").matcher(input);
    while(m.find()) 
        input = input.replace(m.group(), new StringBuilder(m.group()).reverse());
    
    System.out.println(input);
}

这个任务可以在没有正则表达式的情况下实现,将输入字符串拆分为子字符串等,仅在 StringBuilder::insert(int offset, char c)StringBuilder::append(char c) 的帮助下使用 insert 的简单索引计算:

public static String revertDigits(String str) {
    if (str == null || str.isEmpty()) {
        return str;
    }

    StringBuilder sb = new StringBuilder(str.length());
    
    for (int i = 0, j = 0, n = str.length(); i < n; i++) {
        char c = str.charAt(i);
        if (Character.isDigit(c)) {
            sb.insert(j, c); // append in "reverse" mode
        } else {
            sb.append(c);
            j = i + 1;  // store the last position of a non-digit
        }
    }
    
    return sb.toString();
}

测试:

String str="123ABC564";

System.out.println(str + '\n' + revertDigits(str));

输出

123ABC564
321ABC465

Can anyone tell me what's wrong with this code

我相信我在您的代码中发现了两个错误:

  1. 您永远不会将 ans 设置为 0 以外的任何其他值。所以你的 if 条件 ans==0 将永远为真。如果我正确理解了该变量的用途,您可能希望将其替换为 boolean 之类的 insideNumber 并在检测到数字时将其设置为 true 并设置为 false 当你检测到一个字符不是数字时。您的 if 语句将变为 if (insideNumber)
  2. 您没有考虑字符串末尾的数字。您可以通过在字符串中附加一个字母来检查此语句,然后看到 564 将反转为 465。要正确反转尾随数字:在循环后再次检查您是否在数字内,如果是,则将最后一个数字从 firstindex 反转到字符串末尾。

作为替代解决方案,从 Java 9 开始,您还可以使用 Matcher#replaceAll 并反转 1 个或多个数字的每个匹配项。

String result = Pattern.compile("\d+")
    .matcher("123ABC458")
    .replaceAll(m -> new StringBuilder(m.group()).reverse().toString());

System.out.println(result);

输出

321ABC854

Java demo