Расширение сжатой строки - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь взять строку, похожую на эту: 3A5o2n4t, и развернуть ее обратно до такой строки: AAAooooonntttt (число перед буквой - это количество повторений буквы). Я пытался использовать Integer.parseInt (), чтобы получить номер перед буквой, но он захватывает все цифры.Есть ли способ получить одно число за раз?Кроме того, мой код выглядит хорошо после того, как эта проблема решена?Или я все еще немного скучаю?

public String runLengthDecoding(String str3) {
          String convert = "";
          int number = 0;
          if (! str3.isEmpty()) {
             convert = str3.charAt(0) + "";
          }
          for (int i = 0; i <= str3.length() - 1; i++) { 
             if (Character.isDigit(str3.charAt(i))) { //true or false, the current character is a digit
                String temp = "" + str3.charAt(i); //if true, make that character a string
                number = Integer.parseInt(temp); /*now store that character as a number (but I only want the current
                                                   number, not all the numbers in the string*/
                System.out.println(number); /*Testing to see what number is, which is where I found it was 
                                               storing all the numbers */
                String temp2 = str3.charAt(i + 1) + ""; //Its supposed to start making a string that prints the character in front of it
                convert = temp2.repeat(number); //it will print the character however many times that number was stored as
             }

       }
       return convert;
       }

Также я еще не научился использовать массивы, поэтому я не использую массив.

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Отредактировано для:
- разместить строки длиной более 1. Пример: 10AA
- разместить ввод, начинающийся со строки. Пример: A5o

Чтобы решить эту проблему, вы должны получить все одновременные цифры, например, если у вас есть "55s", вы должны получить "55", поэтому ваш код неверен, так как если вы анализируете каждый раз, когда видите цифру, она будет немедленно разберите на 5, но фактическое число равно 55, поэтому вы должны накапливать одновременные цифры в первую очередь и только parseInt, когда встречаете первую не цифру.

Подробнее см. Код и комментарии:

public class Main {
    public static void main(String[] args) {
        System.out.println("Input: 3A5o2n4t => Output : " + runLengthDecoding("3A5o2n4t"));
        System.out.println("Input: 3AA5o2n4t => Output : " + runLengthDecoding("3AA5o2n4t"));
        System.out.println("Input: 10A5o2n4t => Output : " + runLengthDecoding("10A5o2n4t"));
        System.out.println("Input: 10AA5o2n4t => Output : " + runLengthDecoding("10AA5o2n4t"));
        System.out.println("Input: A5o => Output : " + runLengthDecoding("A5o"));
        System.out.println("Input: AB5o => Output : " + runLengthDecoding("AB5o"));
    }

    public static String runLengthDecoding(String str3) {
        String convert = "";
        int number = 0;
        String numberString = "";
        String toBeRepeatedString = "";
        boolean flag = false;
        for (int i = 0; i <= str3.length() - 1; i++) {
            char currentChar = str3.charAt(i);
            if (Character.isDigit(currentChar)) { // true or false, the current character is a digit
                numberString = numberString + currentChar; // store the possible integer
            } else {
                if (i + 1 < str3.length()) {
                    char nextChar = str3.charAt(i + 1); // check if the next char is a digit
                    if (!Character.isDigit(nextChar)) { // if not a digit then append toBeRepeatedString

                        if (i == 0 || i + 1 >= str3.length()) {
                            flag = true;
                        } else {
                            toBeRepeatedString += nextChar;
                            flag = false;
                        }
                    } else {
                        flag = true;
                    }
                }

                if (flag) {
                    toBeRepeatedString += currentChar;

                    // This will accomodate inputs "A3B";
                    if (!numberString.isEmpty()) {
                        number = Integer.parseInt(numberString); // parse the number of repeats
                    } else {
                        number = 1;
                    }

                    numberString = ""; // reset number

                    String temp2 = "";

                    // Repeat the currentChar
                    for (int j = 0; j < number; j++) {
                        temp2 += toBeRepeatedString;
                    }

                    convert = convert + temp2; // store it to the result
                    toBeRepeatedString = ""; // reset toBeRepeatedString
                }

            }

        }
        return convert;
    }

}

Результат:

Input: 3A5o2n4t => Output : AAAooooonntttt
Input: 3AA5o2n4t => Output : AAAAAAooooonntttt
Input: 10A5o2n4t => Output : AAAAAAAAAAooooonntttt
Input: 10AA5o2n4t => Output : AAAAAAAAAAAAAAAAAAAAooooonntttt
Input: A5o => Output : Aooooo
Input: AB5o => Output : ABooooo
0 голосов
/ 07 марта 2019

Вот лучший способ решения вышеуказанной проблемы, он справится со всеми вашими сценариями:

public static void main(String[] args) {
    String input = "5a2s3T66e";
    System.out.println("Input is: "+input+" and output is: "+expandingCondenseString(input));
}
private static String expandingCondenseString(String input){
    StringBuilder result = new StringBuilder();
    String size = "";
    String value = "";
    for (int i=0;i<input.length();i++){
        if (Character.isDigit(input.charAt(i))) {
            size = size + input.charAt(i);
        } else {
            value = value + input.charAt(i);
            if(i+1<input.length() && !Character.isDigit(input.charAt(i+1))){
                continue;
            }
            if(size.isEmpty()){
                size = "1";
            }
            for (int j=0;j<Integer.parseInt(size);j++){
                result.append(value);
            }
            size = "";
            value = "";
        }
    }
    return String.valueOf(result);
}
...