java - 运行长度编码,如何删除仅出现一次的字符之前的“1”?
问题描述
我有一个涉及使用运行长度编码的作业问题。问题是,我们不允许在任何只出现一次的字符前加上“1”。例如,如果你输入 AAABBC,我会得到 3A2B1A,但我需要得到 3A2BA。我缺少一个简单的解决方法吗?
这是我当前的代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String string = "";
Scanner scanner = new Scanner(System.in);
System.out.println("Input:");
String s = scanner.nextLine();
for(int i = 0, count = 1; i < s.length(); i++) {
if (i + 1 < s.length() && s.charAt(i) == s.charAt(i +1))
count++;
else {
string = string.concat(Integer.toString(count))
.concat(Character.toString(s.charAt(i)));
count = 1;
}
}
System.out.println(string);
}
}
解决方案
如果计数为 1,只需添加一些额外的逻辑以不打印计数:
for (int i=0, count=1; i < s.length(); i++) {
if (i + 1 < s.length() && s.charAt(i) == s.charAt(i+1)) {
count++;
}
else {
String prefix = count > 1 ? Integer.toString(count) : "";
string = string.concat(prefix)
.concat(Character.toString(s.charAt(i)));
count = 1;
}
}
作为旁注,您应该使用 aStringBuilder
而不是原始字符串连接(尽管 Java 可能会自动选择在后台为您执行此操作)。
如果你想坚持你当前的实现,那么这里有一个单行正则表达式清理,你可以尝试:
string = string.replaceAll("(?<=(?:\\D|^))1(?=\\D)", "");