Java 运行 长度解码(扩展压缩字符串)
Java run length decoding (expanding a compressed string)
public static String decompressString (String text) {
int count = 0;
StringBuilder result = new StringBuilder () ;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if (Character.isDigit(c)) {
count = count * 10 + c - '0';
} else {
while (count >0){
result.append(c);
count--;
}
}
}
return result.toString();
}
该程序应该从 5A5Bcd 等主要方法中获取 运行 长度的编码字符串,并且 return 该字符串采用 运行 长度的解码格式。 5A5Bcd -> AAAAABBBBBcd。我遇到的问题 运行 是代码似乎忽略了前面没有数字的字符。在上面的示例中,我 returning AAAAABBBBB 而不是 AAAAABBBBBcd; 'c' 和 'd' 前面没有数字,因此无法识别。任何想法,我已经在这一点上停留了很长一段时间了。
当您在示例中遇到 "c" 和 "d" 字符时,您的 count
变量不会为非零,因为在处理“ 5B".
我在您的代码中看到的最简单的修复方法是在 while
循环之前添加一个检查:
if (Character.isDigit(c)) {
// ...
} else {
if (count == 0) {
// Single-run-length characters have an implicit "1" prepended
count = 1;
}
while (count > 0) {
// ..
}
}
每当您开始处理新角色时,计数都为 0,因此不会附加任何内容。您希望 count 在循环开始时为 1,并在 while(count > 0) 循环后将其设置为 1。
你能解释一下你为什么这样做吗
count = count * 10 + c - '0';
而不是 count = c(也必须更改)?
您可以通过以下方式解决此问题
private static String decode(String encodedString) {
String decodedString = null;
//aaabbbcccccdd
//3a3b5c2d
int n = encodedString.length();
StringBuilder sb= new StringBuilder();
for (int i = 0; i < n; i++) {
if(i+1 <n && i%2 ==0)
sb.append(repeat(Integer.parseInt(String.valueOf(encodedString.charAt(i))),encodedString.charAt(i+1)));
}
return sb.toString();
}
private static String repeat(int length, char charAt) {
StringBuilder sb = new StringBuilder();
for (int j = 0; j < length; j++) {
sb.append(charAt);
}
return sb.toString();
}
public class RunLengthDecode {
public static void main(String[] args) {
String string="9a8b8c5d";
String resultString="";
for (int i = 0; i < string.length(); i+=2) {
int count=Character.getNumericValue(string.charAt(i));
for(int j=0;j<count;j++) {
resultString+=string.charAt(i+1);
}
}
System.out.println(resultString);
}
}
public static String decompressString (String text) {
int count = 0;
StringBuilder result = new StringBuilder () ;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if (Character.isDigit(c)) {
count = count * 10 + c - '0';
} else {
while (count >0){
result.append(c);
count--;
}
}
}
return result.toString();
}
该程序应该从 5A5Bcd 等主要方法中获取 运行 长度的编码字符串,并且 return 该字符串采用 运行 长度的解码格式。 5A5Bcd -> AAAAABBBBBcd。我遇到的问题 运行 是代码似乎忽略了前面没有数字的字符。在上面的示例中,我 returning AAAAABBBBB 而不是 AAAAABBBBBcd; 'c' 和 'd' 前面没有数字,因此无法识别。任何想法,我已经在这一点上停留了很长一段时间了。
当您在示例中遇到 "c" 和 "d" 字符时,您的 count
变量不会为非零,因为在处理“ 5B".
我在您的代码中看到的最简单的修复方法是在 while
循环之前添加一个检查:
if (Character.isDigit(c)) {
// ...
} else {
if (count == 0) {
// Single-run-length characters have an implicit "1" prepended
count = 1;
}
while (count > 0) {
// ..
}
}
每当您开始处理新角色时,计数都为 0,因此不会附加任何内容。您希望 count 在循环开始时为 1,并在 while(count > 0) 循环后将其设置为 1。 你能解释一下你为什么这样做吗 count = count * 10 + c - '0'; 而不是 count = c(也必须更改)?
您可以通过以下方式解决此问题
private static String decode(String encodedString) {
String decodedString = null;
//aaabbbcccccdd
//3a3b5c2d
int n = encodedString.length();
StringBuilder sb= new StringBuilder();
for (int i = 0; i < n; i++) {
if(i+1 <n && i%2 ==0)
sb.append(repeat(Integer.parseInt(String.valueOf(encodedString.charAt(i))),encodedString.charAt(i+1)));
}
return sb.toString();
}
private static String repeat(int length, char charAt) {
StringBuilder sb = new StringBuilder();
for (int j = 0; j < length; j++) {
sb.append(charAt);
}
return sb.toString();
}
public class RunLengthDecode {
public static void main(String[] args) {
String string="9a8b8c5d";
String resultString="";
for (int i = 0; i < string.length(); i+=2) {
int count=Character.getNumericValue(string.charAt(i));
for(int j=0;j<count;j++) {
resultString+=string.charAt(i+1);
}
}
System.out.println(resultString);
}
}