Java游程解码问题:无前导数字的字符未被识别
解决Java游程解码忽略无前导数字字符的问题
搞定这个游程解码的问题很简单!你的程序现在漏掉无前导数字的字符,核心原因是逻辑只处理了「数字+字符」的组合,没考虑到那些单独出现的字符——这类字符默认应该重复1次对吧?
问题根源
你原来的代码大概率只会在识别到数字前缀时才处理后续字符,遇到没有数字的单个字符(比如示例里的c和d)就直接跳过了。我们需要调整逻辑,让程序能区分两种情况:
- 带数字前缀的字符:按指定次数重复
- 无数字前缀的字符:默认重复1次
修复后的完整代码
下面是调整后的解码程序,已经处理了所有情况,包括多位数重复、单个字符等:
public class RunLengthDecoder { public static void main(String[] args) { // 检查是否传入了编码字符串参数 if (args.length == 0) { System.out.println("请在运行时传入游程编码字符串作为参数,例如:java RunLengthDecoder 5A5Bcd"); return; } String encodedStr = args[0]; String decodedStr = decodeRunLength(encodedStr); System.out.println("解码结果:" + decodedStr); } private static String decodeRunLength(String encoded) { StringBuilder result = new StringBuilder(); StringBuilder numBuffer = new StringBuilder(); // 用来累积连续的数字字符(处理多位数) for (char currentChar : encoded.toCharArray()) { if (Character.isDigit(currentChar)) { // 如果是数字,先累积到缓冲区 numBuffer.append(currentChar); } else { // 计算重复次数:有数字就用数字,没有则默认1 int repeatCount = numBuffer.length() > 0 ? Integer.parseInt(numBuffer.toString()) : 1; // 将当前字符重复指定次数后加入结果 result.append(String.valueOf(currentChar).repeat(repeatCount)); // 重置数字缓冲区,准备下一轮 numBuffer.setLength(0); } } return result.toString(); } }
关键逻辑说明
- 数字缓冲区
numBuffer:用来收集连续的数字字符,支持多位数的游程编码(比如10Z会被解码成10个Z) - 非数字字符处理:
- 当遇到非数字字符时,先检查
numBuffer是否有内容:如果有,就把缓冲区的数字转成整数作为重复次数;如果没有,就默认重复1次 - 处理完当前字符后,立即重置
numBuffer,确保下一个字符的处理不受影响
- 当遇到非数字字符时,先检查
- 边界情况覆盖:
- 空输入:返回空字符串
- 单个无数字字符(比如
X):返回X - 混合编码(比如
2Ab3Cd):解码成AbbCCCd
测试示例
运行命令:
java RunLengthDecoder 5A5Bcd
输出结果:
解码结果:AAAAABBBBBcd
内容的提问来源于stack exchange,提问作者cise
相关产品推荐
相关产品推荐

