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

时间:2018-03-04 22:57:39

标签: java decoding run-length-encoding

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)中获取行程编码的字符串,并以运行长度解码格式返回该字符串。 5A5Bcd - &gt; AAAAABBBBBcd。我遇到的问题是代码似乎忽略了不在数字前面的字符。在上面的例子中,我返回AAAAABBBBB而不是AAAAABBBBBcd; &#39; c&#39;并且&#39; d&#39;不是数字,因此不被识别。任何想法,我现在已经坚持了很长一段时间。

3 个答案:

答案 0 :(得分:1)

当您在示例中遇到“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) {
        // ..
    }
}

答案 1 :(得分:0)

无论何时开始处理新字符,count都为0,因此不会附加任何内容。您希望在循环开始时计数为1,并在while(count&gt; 0)循环后将其设置为1。 你能解释一下你的原因吗?      count = count * 10 + c - '0'; 而不是count = c(那也必须改变)?

答案 2 :(得分:0)

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

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();
    }