
字符串压缩是一种常见的数据处理技术,其目标是将连续重复的字符序列替换为该字符及其重复次数。例如,将字符串 "abbbccccc" 压缩为 "ab3c4"。这种技术在日志处理、数据存储和网络传输中都有应用,有助于减少数据量。
我们来看一个尝试实现此功能的Java代码示例:
public class Test12CompressString {
public static String getCompressedString(String str) {
String newString = "";
int count = 1;
int len = str.length()-1; // len 是字符串最后一个字符的索引
for (int i = 0; i <= len ; i++) {
if(i != len) { // 仅当不是最后一个字符时执行此块
// System.out.println(i); // 调试输出
if(str.charAt(i) == str.charAt(i+1)) {
count++;
continue; // 字符相同,计数增加,跳过当前循环剩余部分
}
// 字符不同时,或达到最后一个字符前一个字符时
if(count == 1) {
newString = newString+str.charAt(i); // 如果只出现一次,直接添加字符
} else {
newString = newString+str.charAt(i)+count; // 添加字符和计数
}
// 以下代码块逻辑存在问题,且与前一个if/else重复,实际不会被有效执行
// if ( str.charAt(i) != str.charAt(i+1)) {
// count = 1;
// continue;
// }
}
}
return newString;
}
public static void main(String[] args) {
String str = "abbbccccc";
String ans = getCompressedString(str);
System.out.print(ans); // 预期输出: ab3c4, 实际输出: ab3
}
}当输入字符串为 "abbbccccc" 时,预期输出是 "ab3c4",但实际输出却是 "ab3"。问题出在代码对字符串末尾字符序列的处理上。
问题根源分析:
简而言之,原代码在处理到字符串的倒数第二个字符时,如果它与最后一个字符相同,会正确地增加 count。但当循环到达最后一个字符时,由于 i == len,所有输出逻辑都被跳过,导致最后一个字符序列无法被处理。
立即学习“Java免费学习笔记(深入)”;
要解决这个问题,我们需要确保在以下两种情况下将当前字符及其计数添加到结果中:
为了提高字符串拼接的效率,我们应该使用 StringBuilder 而不是 String 的 + 操作符。
以下是修正并优化后的Java代码:
public class CompressedString {
public static String getCompressedString(String str) {
if (str == null || str.isEmpty()) {
return ""; // 处理空字符串或null的情况
}
StringBuilder compressedString = new StringBuilder();
int count = 1;
for (int i = 0; i < str.length(); i++) {
// 检查当前字符是否与下一个字符相同,且未超出字符串边界
if (i + 1 < str.length() && str.charAt(i) == str.charAt(i + 1)) {
count++; // 字符相同,计数增加
} else {
// 字符不同,或者已经到达字符串的末尾
compressedString.append(str.charAt(i)); // 添加当前字符
if (count > 1) {
compressedString.append(count); // 如果计数大于1,添加计数
}
count = 1; // 重置计数器为1,为下一个字符序列做准备
}
}
return compressedString.toString();
}
public static void main(String[] args) {
String str1 = "abbbccccc";
System.out.println("Original: " + str1 + ", Compressed: " + getCompressedString(str1)); // 预期: ab3c4
String str2 = "a";
System.out.println("Original: " + str2 + ", Compressed: " + getCompressedString(str2)); // 预期: a
String str3 = "aaabbc";
System.out.println("Original: " + str3 + ", Compressed: " + getCompressedString(str3)); // 预期: a3b2c
String str4 = "";
System.out.println("Original: " + str4 + ", Compressed: " + getCompressedString(str4)); // 预期: (空字符串)
String str5 = "abc";
System.out.println("Original: " + str5 + ", Compressed: " + getCompressedString(str5)); // 预期: abc
}
}代码逻辑解释:
通过这种方式,无论字符序列在字符串的哪个位置,包括末尾,都能被正确地处理和压缩。
字符串压缩是一个典型的考察循环逻辑和边界条件处理能力的编程问题。通过分析原始代码的不足,我们发现未能正确处理字符串末尾字符序列是导致压缩不完整的主要原因。优化后的解决方案通过在字符序列结束或到达字符串末尾时统一处理字符及其计数,并结合 StringBuilder 提高了效率和健壮性。这强调了在设计算法时,对所有可能情况,特别是边界条件的全面考虑至关重要。
以上就是Java字符串压缩算法优化:处理末尾字符序列的策略的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号