Java 运行 长度解码(扩展压缩字符串)

Java run length decoding (expanding a compressed string)

public static String decompressString (String text) {
    int count = 0;
    StringBuilder result = new StringBuilder () ;
    for (int i = 0; i < text.length(); i++) {
        char c = text.charAt(i);
        if (Character.isDigit(c)) {
            count = count * 10 + c - '0';
        } else { 
            while (count >0){ 
                result.append(c);
                count--;
            }
        }

    }
    return result.toString();
}

该程序应该从 5A5Bcd 等主要方法中获取 运行 长度的编码字符串,并且 return 该字符串采用 运行 长度的解码格式。 5A5Bcd -> AAAAABBBBBcd。我遇到的问题 运行 是代码似乎忽略了前面没有数字的字符。在上面的示例中,我 returning AAAAABBBBB 而不是 AAAAABBBBBcd; 'c' 和 'd' 前面没有数字,因此无法识别。任何想法,我已经在这一点上停留了很长一段时间了。

当您在示例中遇到 "c" 和 "d" 字符时,您的 count 变量不会为非零,因为在处理“ 5B".

我在您的代码中看到的最简单的修复方法是在 while 循环之前添加一个检查:

if (Character.isDigit(c)) {
    // ...
} else {
    if (count == 0) {
        // Single-run-length characters have an implicit "1" prepended
        count = 1;
    }
    while (count > 0) {
        // ..
    }
}

每当您开始处理新角色时,计数都为 0,因此不会附加任何内容。您希望 count 在循环开始时为 1,并在 while(count > 0) 循环后将其设置为 1。 你能解释一下你为什么这样做吗 count = count * 10 + c - '0'; 而不是 count = c(也必须更改)?

您可以通过以下方式解决此问题

private static String decode(String encodedString) {
        String decodedString = null;
        //aaabbbcccccdd
        //3a3b5c2d
        
        int n = encodedString.length();
        StringBuilder sb= new StringBuilder();
        for (int i = 0; i < n; i++) {
            if(i+1 <n && i%2 ==0)
            sb.append(repeat(Integer.parseInt(String.valueOf(encodedString.charAt(i))),encodedString.charAt(i+1)));
        }
        
        return sb.toString();
                
    }

    private static String repeat(int length, char charAt) {
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < length; j++) {
            sb.append(charAt);
        }
        return sb.toString();
    }
public class RunLengthDecode {
    public static void main(String[] args) {
        
        String string="9a8b8c5d";
        String resultString="";
        

        for (int i = 0; i < string.length(); i+=2) {
            int count=Character.getNumericValue(string.charAt(i));
            
            for(int j=0;j<count;j++) {
            resultString+=string.charAt(i+1);
            }
        }
        System.out.println(resultString);
        
    }
}