如何反转字符串中数字的顺序?

时间:2015-05-31 17:22:21

标签: java string reverse digits

给定Java中的字符串,如何获得一个新的字符串,其中所有相邻的数字序列都被反转?

我的代码:

import static java.lang.System.*;

public class P2
{
    public static void main(String[] args)
    {
        if(args.length < 1)
        {
            err.printf("Usage: java -ea P2 String [...]\n");
            exit(1);
        }

        String[] norm = new String[args.length];
        for(int i = 0; i<norm.length;i++)
        {
            norm[i] = args[i];
        }
    }

    public String invertDigits(String[] norm)
    {   

    }
}

作为一个例子,这应该是它应该做的:

输入:1234 abc9876cba a123 312asd a12b34c56d

  

1234 - &gt; 4321

     

abc9876cba - &gt; abc6789cba

     

a123 - &gt; A321

     

312asd - &gt; 213asd

     

a12b34c56d - &gt; a21b43c65d

3 个答案:

答案 0 :(得分:4)

虽然这个问题被严重低估,但现在提出的问题似乎很清楚。我选择在递归函数中使用regular expression match来解决它。

private static String reverseDigits(String s) {
    // the pattern will match a sequence of 1 or more digits
    Matcher matcher = Pattern.compile("\\d+").matcher(s);
    // fetch the position of the next sequence of digits
    if (!matcher.find()) {
        return s; // no more digits
    }
    // keep everything before the number
    String pre = s.substring(0, matcher.start());
    // take the number and reverse it
    String number = matcher.group();
    number = new StringBuilder(number).reverse().toString();

    // continue with the rest of the string, then concat!
    return pre + number + reverseDigits(s.substring(matcher.end()));
}

这是迭代方法。

private static String reverseDigits(String s) {
    //if (s.isEmpty()) return s;
    String res = "";
    int base = 0;
    Matcher matcher = Pattern.compile("\\d+").matcher(s);
    while (!matcher.hitEnd()) {
        if (!matcher.find()) {
            return res + s.substring(base);
        }
        String pre = s.substring(base, matcher.start());
        base = matcher.end();
        String number = matcher.group();
        number = new StringBuilder(number).reverse().toString();
        res += pre + number;
    }
    return res;
}

答案 1 :(得分:0)

    String str = "1234";

    //indexes
    int i = 0, j = str.length()-1;

    // find digits (if any)
    while (!Character.isDigit(str.charAt(i)) && i < str.length()) {
        i++;
    }
    while (!Character.isDigit(str.charAt(j)) && j >= 0) {
        j--;
    }

    // while we havent searched all the digits
    while (i < j) {
        // switch digits
        str = str.substring(0, i) + str.charAt(j) + str.substring(i + 1, j) + str.charAt(i) + str.substring(j + 1);
        i++;
        j--;
        // find the next digits
        while (!Character.isDigit(str.charAt(i)) && i < str.length()) {
            i++;
        }
        while (!Character.isDigit(str.charAt(j)) && j >= 0) {
            j--;
        }
    }
    System.out.println(str);

答案 2 :(得分:0)

另一种不使用正则表达式类的动态方法:

public static String reverseOnlyNumbers(String s) {
    StringBuilder digits = new StringBuilder();
    StringBuilder result = new StringBuilder();

    boolean start = false;

    for (int i = 0; i < s.length(); i++) {
        Character c = s.charAt(i);

        if (Character.isDigit(c)) {
            start = true;
            digits.append(c);
        }else {
            start = false;
            if (digits.length() > 0) {
                result.append(digits.reverse().toString());
                digits = new StringBuilder();
            }
            result.append(c);
        }
    }

    return start ? result.append(digits.reverse()).toString() : result.toString();
}
相关问题