2015-05-31 2 views
-6

С учетом строки в 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 -> 4321

abc9876cba -> abc6789cba

a123 -> A321

312asd -> 213asd

a12b34c56d -> a21b43c65d

+2

Вы должны дать пример строки и какой результат вы ожидаете от него, чтобы помочь нам понять. Кроме того, что вы пробовали до сих пор? –

+1

любой пример? что ты уже испробовал? Любой код, который вы пробовали? – SMA

+0

Я отредактировал вопрос – mackdiogo

ответ

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); 
4

Хотя вопрос сильно downvoted, предложенная проблема сейчас кажется очевидным. Я решил решить его с помощью 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; 
} 
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(); 
} 
Смежные вопросы