算法/数据结构访谈

时间:2012-11-20 21:53:06

标签: algorithm data-structures

目标是将a3b5c2之类的数组就地转换为aaabbbbbcc。 我有一个解决方案:

  • 假设数组的大小无限,
  • 我从最后解析数组。
  • 寻找一个数字(比如n)
  • 取决于我得到多少位数,我寻找下一个字符。
  • 当我得到它时,我将元素从当前位置移动到数组末尾n-1位置。
  • 使用遇到的角色填充空缺职位。

此解决方案的复杂性为O(n ^ 2)。是否存在复杂度小于O(n ^ 2)的解决方案?

1 个答案:

答案 0 :(得分:3)

如果你解析一次数组,你可以通过求和所有数值来知道最后一个元素的位置。

解析它一次并找到它的最终大小。

一旦你这样做,开始从“结束”(从其最终值开始)填充它:2次c,然后5次b ......

这是一个O(n)就地解决方案。

修改

正如srbh.kmr在评论中所说的那样,如果数组中只有一次重复出现了一系列错误放置的字符,这将无效。例如,如果我们有数组a1b1c1d1e7,上面的答案将删除最后的字母。

导致问题的唯一数字是1,我们可以在O(n)中处理:

在如上所述处理阵列之前,消除那些。从头开始,解析数组,每次找到1时,擦除它并向前移动剩余的字母(不是整个剩余的数组,只是下一个字符)。如果在数组中找到多个1 s,则数组的第一个和第二个部分之间的 hole 会变大。对于上面的示例数组,步骤如下所示:

a1b1c1d1e7
// First parse gives length = 1+1+1+1+7

// Repair ones
a b1c1d1e7
ab 1c1d1e7
ab  c1d1e7
abc  1d1e7
abc   d1e7
abcd   1e7
abcd    e7
abcde    7
abcde7

然后,应用上面的算法。如果在字符后面没有找到数字,只需将字符复制到数组末尾的位置:

// Fill final array
abcde7    x
          ^ 11th position
abcde     e
abcde    ee
abcde   eee
abcde  eeee
abcde eeeee
abcdeeeeeee
abcdeeeeeee  // Here we overwrite the first "e"
abcdeeeeeee  // Then we see there are lone letters (4 times), so we leave them.