【发布时间】:2020-07-14 21:00:31
【问题描述】:
我正在尝试解决一个问题,即我的任务是通过计算字符的出现次数并将该计数添加到字符旁边来就地压缩 char 数组。例如,给定这个输入:
['a','a','b','b','c','c','c']
我需要退货:
['a','2','b','2','c','3']
因为a 出现两次,b 出现两次,c 出现 3 次。剩余数组索引中的内容无关紧要。如果计数超过一位,则必须按顺序放置各个数字。所以如果a在给定数组中出现12次,结果应该是[ 'a', '1', '2' ]。
我想使用两指针方法解决这个问题。一个指针是慢指针,另一个指针是快指针。较慢的用于获取字符进行比较,并且仅在找到新字符时才移动。为了确保慢速找到下一个字符,我根据count 变量中的位数移动它。快速的不断增加,用于获取每个字符的计数;如果找到不同的字符,此计数将重置。为了处理count 中的多个数字,我通过将其转换为String 来操作该数字。
但是,使用给出的示例,我的代码给出了以下结果:
['a','2','b','2','c','c','c']
我已通过调试器运行它,但我的代码似乎无法正确检查数组的最终序列。我不确定如何解决这个问题 - 如何更改我的代码以正确循环遍历数组?这是我的代码:
public static char[] compress(char[] chars) {
if (chars.length == 1) return chars;
int count = 1;
int slow = 0;
for (int fast = 1; fast < chars.length; fast++) {
if (chars[slow] != chars[fast]) {
int pos = 1;
String countStr = String.valueOf(count);
for (int j = 0; j < countStr.length(); j++) {
chars[slow + pos] = countStr.charAt(j);
pos++;
}
count = 1;
slow += pos;
} else {
count++;
}
}
return chars;
}
运行使用:
compress(new char[] {'a','a','b','b','c','c','c'});
【问题讨论】:
-
['a','a','b','a']的预期输出是什么? -
你可以假设输入总是排序的
-
谢谢。 ['a','b'] 的预期输出是什么?
-
应该是
['a','1','b','1']。刚刚意识到这会使我的错误检查出错,但我会将其留在那里以避免混淆。 -
我觉得值得注意的是,地图是执行此操作的标准方式。它会简单得多,也不需要排序列表。