以下是作业的基础知识:
您的任务是编写一个程序,对使用简单形式的游程编码进行编码的字符序列进行解码,如下面的规则所述。
任何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;
}
}
答案 0 :(得分:1)
我建议您尝试将解码方法拆分为两个主要逻辑部分: 一个用于实际执行RLE的情况,另一个用于具有一系列非重复字符的情况,其中1个必须被转义。
后者易于实施,您对该部分的解决方案似乎是正确的。
前者需要您遍历下一个字符,直到找到序列的末尾。 如果您读取的只是1,只需将其添加到输出中即可。 如果有一个1,你需要向前看下一个字符以查看是否还有另一个1,这意味着有一个必须被转义的未重复的1,这将被添加到输出中(消耗前瞻性) )。如果前瞻不是1(包括没有下一个字符的特殊情况),则不重复的字符序列在此处结束,并且不会将任何内容添加到输出中。
由于这个页面不应该解决你的作业,我不会发布一个完整的解决方案。