问题: 行程编码(RLE)是一种简单的“压缩算法”(一种算法,它采用一块数据并减小其大小,产生一个在较小空间内包含相同信息的块)。它通过用表示整个序列的短“标记”替换相同数据项的重复序列来工作。将RLE应用于字符串涉及在字符串中查找重复相同字符的序列。每个这样的序列应该被一个由以下内容组成的“令牌”替换:
the number of characters in the sequence
the repeating character
如果一个角色不重复,则应该单独留下。
例如,请考虑以下字符串:
qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT
应用RLE算法后,此字符串将转换为:
q9w5e2rt5y4qw2Er3T
这是我到目前为止所做的,我不知道如何计算角色重复次数的次数。有人可以帮忙!!!!
public class Compress1 {
public static void main(String[] args){
System.out.println("Enter a string");
String input = IO.readString();
char[] inputChar = input.toCharArray();
for (int index = 0; index < inputChar.length; index++){
char current = inputChar[index];
if (current == (current + 1)){
int count =
}
}
}
}
答案 0 :(得分:2)
而不是调试代码,这里有一些工作代码:
String input = "qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT";
String previous = input.substring(0, 1);
int count = 1;
for (String c : input.substring(1).split("")) {
if (previous.equals(c)) {
count++;
} else {
System.out.print((count == 1 ? "" : count) + previous);
previous = c;
count = 1;
}
}
System.out.println((count == 1 ? "" : count) + previous);
<强>输出:强>
q9w5e2rt5y4qw2Er3T
将它与你自己的比较,并按照其逻辑找出你出错的地方。
答案 1 :(得分:1)
你可以试试这个:
String str = "qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT";
char[] arr = str.toCharArray();
int count = 1;
StringBuilder sb = new StringBuilder();
char prev = arr[0];
for (int i = 1; i < arr.length; i++) {
char curr = arr[i];
prev = arr[i - 1];
if (curr == prev) {
count++;
} else {
if (count < 2) {
sb.append(prev);
} else {
sb.append(count).append(prev);
count = 1;
}
}
}
if (count < 2) {
sb.append(prev);
} else {
sb.append(count).append(prev);
}
System.out.println("Compressed : " + sb.toString());
输出:Compressed : q9w5e2rt5y4qw2Er3T
答案 2 :(得分:0)
这是您的代码的工作版本。它逐个字符地沿着输入字符串。如果下一个字符不同而不是前一个字符,那么它会输出字符的RLE版本(例如,如果字符仅出现一次,则为字符,或者如果字符出现超过字符,则为字符后跟字符一旦)。如果下一个字符与前一个字符是相同,则它会递增一个计数器以跟踪出现次数。
如果仔细观察,您会注意到我在输入字符串的末尾附加了一个新行(\n
)。这允许我的算法“知道”它已经到达输入字符串的末尾。如果您计划为RLE处理输入多个字符串,它也会很好地打印换行符。
在某些时候,您可能想要提取一个执行RLE处理的方法。目前,我已将代码保留在main()
方法中。
public class Compress1 {
public static void main(String[] args){
System.out.println("Enter a string");
String input = IO.readString();
// check for null or empty input
if (input == null || input.length() == 0) {
System.out.println("null or empty string input");
System.exit(0);
}
// handle single character input
if (input.length() == 1) {
System.out.println(String.valueOf(curr));
System.exit(0);
}
// add a newline character to the end of the input string
// so the algorithm can detect a "change" at the end
input += "\n";
char curr = input.charAt(0);
int count=1;
for (int i=1; i < input.length(); ++i) {
char next = input.charAt(i);
if (curr != next) {
if (count > 1) {
System.out.print(count + String.valueOf(curr));
}
else {
System.out.print(curr);
}
count = 1;
}
else {
++count;
}
curr = next;
}
}
}
以下是我使用IntelliJ测试的示例输入和输出:
<强>输入:强>
qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT
<强>输出:强>
q9w5e2rt5y4qw2Er3T
答案 3 :(得分:0)
public static void main (String[] args) {
System.out.println("Enter a string");
String input = IO.readString();
final char[] charArray = input.toCharArray();
final StringBuilder stringBuilder = new StringBuilder();
int index = 1;
for (int current = 1, previous = 0; current <= charArray.length; current++, previous++) {
if (current == charArray.length || charArray[previous] != charArray[current]) {
if (index > 1) {
stringBuilder.append(index);
}
stringBuilder.append(charArray[previous]);
index = 1;
} else {
index++;
}
}
System.out.println(stringBuilder.toString());
}