【问题标题】:Algorithm fails to execute on final array values算法无法对最终数组值执行
【发布时间】: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']。刚刚意识到这会使我的错误检查出错,但我会将其留在那里以避免混淆。
  • 我觉得值得注意的是,地图是执行此操作的标准方式。它会简单得多,也不需要排序列表。

标签: java arrays algorithm


【解决方案1】:

这里更好的方法(伪代码)是:

int i = 0;
while (i < chars.length) {
  int start = i++;
  while (i < chars.length && chars[i] == chars[start]) {
    ++i;
  }

  int count = i - start;
  // Write chars[start] and count to the output.
}

因为这会在外部循环的每次迭代中写入 chars[start]count,所以当您到达数组末尾时它不会错过最后一次迭代:它的处理方式与所有其他运行相同。

【讨论】:

    【解决方案2】:

    这是因为你永远不会对最后一个字符进行替换,只有当字符发生变化时。 在 for 循环终止后,您需要在末尾进行额外的字符替换。

    【讨论】:

      【解决方案3】:

      你可以在数组的最后添加不同的字符(不同于最后一个实际的 last )然后它会起作用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-30
        • 1970-01-01
        • 2014-03-31
        • 2023-03-14
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多