目标是将a3b5c2
之类的数组就地转换为aaabbbbbcc
。
我有一个解决方案:
n-1
位置。 此解决方案的复杂性为O(n ^ 2)。是否存在复杂度小于O(n ^ 2)的解决方案?
答案 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.