java - Java中的运行长度编码 - 意外输出
问题描述
我被指派用 Java 为我的班级做一项任务。它基本上是一个运行长度编码程序,它遍历输入的字符串并对其进行压缩,(例如:aaabbb 变为 a4b3)
过程:
我的代码遍历输入字符串中的每个字符,并检查原始字符是否等于下一个字符。如果它是真的,它会增加计数并最终连接计数和原始字母。如果原始字母不等于下一个字符 - 它从 1 开始计数并启动新的 for 循环。如果 for 循环中的字符等于位置i中的字符,则它会递增计数,直到下一个字母不等于前一个字母。重复此过程,直到读取输入中的所有字符。
我尝试编写以下代码:
import java.util.Scanner;
class RLE {
RLE() {
Scanner sc = new Scanner(System.in);
String input = sc.next();
int count = 0;
for (char c : input.toCharArray()) {
if (input.charAt(0) == c) {
count++;
input = input.charAt(0) + Integer.toString(count);
}
else {
count = 1;
for (int i = 0; i < input.length(); i++) {
if (c == input.charAt(i)) {
count++;
}
}
input = input.concat(c + Integer.toString(count));
}
}
System.out.println(input);
}
}
例子
这是我的以下输入:aaabbbccc
实际输出:a3b1b2b3c1c2c3
预期输出:a3b3c3
有人可以解释一下我做错了什么吗?我尝试用不同的方法重做代码,但没有成功。我最好的猜测是扩展了原始输入字符串,因此扩展了原始 for 循环,但这也可能是错误的。非常感谢!
解决方案
首先,您不应该将变量输入用于输入和输出。它使阅读变得困难,并且可能会产生错误。比你应该检查一个空输入。之后,您只需要一个循环来选择一个角色,并将其与以下几个进行比较。如果相同,则增加一个计数器,如果不将其与计数一起添加到输出中,则重置字符和计数器并继续。最后,您必须检查是否还有剩余。
import java.util.Scanner;
class RLE {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.next();
int count = 0;
String output = "";
if (!input.isEmpty()) {
char actual = input.charAt(0);
for (char c : input.toCharArray()) {
if (actual == c) {
count++;
} else {
output += actual + Integer.toString(count);
actual = c;
count = 1;
}
}
if (count > 0) {
output += actual + Integer.toString(count);
}
}
System.out.println(output);
}
}
推荐阅读
- r - 从 GitHub 安装 R 包时出现错误“依赖项中的无效比较运算符:>=”
- php - 使用 .htaccess 和国家/地区位置(在网站 url 中)重定向到自定义 404 页面
- autodesk-forge - 伪造查看器缓存问题
- tensorflow - 如何在张量流中实现大整数或大小数作为数据类型
- c# - 单元测试中的匿名类型
- r - 通过堆积条形图中的数值变量对具有分类变量的列进行排序
- javascript - 如果身体有灰度滤镜,有没有办法让图像具有原始颜色?
- java - 如何使用 GeckoDriver Firefox 和 Selenium 下载文件?
- java - 使用spring Mapper映射Map的对象-Java
- typescript - 打字稿转译器不应该至少警告从超类构造函数调用虚拟方法吗?