Java解码运行长度分配

时间:2015-04-21 19:45:21

标签: java decoding

以下是作业的基础知识:
您的任务是编写一个程序,对使用简单形式的游程编码进行编码的字符序列进行解码,如下面的规则所述。

任何2至9个相同字符的序列由两个字符编码。第一个字符是序列的长度,由字符2到9之一表示。第二个字符是重复字符的值。通过首先编码9个字符,然后是剩余的字符来处理超过9个相同字符的序列。

任何不包含任何字符连续重复的字符序列由1个字符后跟字符序列表示,以另一个字符结尾。如果1出现作为序列的一部分,则使用1进行转义,因此输出两个1个字符。

示例输入和输出:

输入:

  

9A1ABC131
  1112 3124
  111111

输出:

  

AAAAAAAAAABC111
  12 344
  11

我的代码到目前为止我还没有完成工作:

import java.util.Scanner;

public class RunLength {

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        String test = kb.nextLine();
        System.out.println(decode(test));
    }

    public static String encode(String s) {
        if (s == "" || s == null) return "";
        StringBuffer sb = new StringBuffer();
        int count = 0;
        char ch = 0;
        for (int i = 0; i < s.length(); i++) {
            if (i == 0) {
                ch = s.charAt(i);
                count++;
            } else {
                if (ch == s.charAt(i)) {
                    count++;
                } else {
                    sb.append(ch).append(count);
                    count = 1; // count is set to 1 as 1 occurrence of ch has been appended to the output
                    ch = s.charAt(i);
                }
            }
        }
        sb.append(ch).append(count);
        return sb.toString();
    }

    public static String decode(String st) {
        if (st == "" || st == null) return "";
        char[] stArr = st.toCharArray();
        char lastseen = 0;
        StringBuffer sb = new StringBuffer();
        for (char s : stArr) {
            if (!Character.isDigit(s)) {
                lastseen = s;
                sb.append(s);
            } else {
                int n = Integer.parseInt(String.valueOf(s));
                for (int i = 0; i < n - 1; i++) {
                    sb.append(lastseen);
                }
            }
        }
        return sb.toString();
    }

    public static int[] decode2(String source) {
        int arrLength = 0;
        for (int i = 0; i < source.length(); i += 2) {
            int count = Character.getNumericValue(source.charAt(i));
            arrLength += count;
        }
        int array[] = new int[arrLength];
        int k = 0;
        for (int i = 0; i < source.length(); i += 2) {
            int count = Character.getNumericValue(source.charAt(i));
            for (int j = 0; j < count; j++) {
                array[i + k] = Character.getNumericValue(source.charAt(i + 1));
            }
        }
        return array;
    }
}

1 个答案:

答案 0 :(得分:1)

我建议您尝试将解码方法拆分为两个主要逻辑部分: 一个用于实际执行RLE的情况,另一个用于具有一系列非重复字符的情况,其中1个必须被转义。

后者易于实施,您对该部分的解决方案似乎是正确的。

前者需要您遍历下一个字符,直到找到序列的末尾。 如果您读取的只是1,只需将其添加到输出中即可。 如果有一个1,你需要向前看下一个字符以查看是否还有另一个1,这意味着有一个必须被转义的未重复的1,这将被添加到输出中(消耗前瞻性) )。如果前瞻不是1(包括没有下一个字符的特殊情况),则不重复的字符序列在此处结束,并且不会将任何内容添加到输出中。

由于这个页面不应该解决你的作业,我不会发布一个完整的解决方案。