[英]How to replace a specific character in an array with two characters
所以我刚从工作面试回来,我不得不面对的一个问题是:
“给定一个字符数组和三个字符,例如:
数组:[a,b,c,z,s,w,y,z,o]
字符 1:'z'
字符 2:'R' 字符 3:'R'
您的目标是将数组中的每个“z”替换为 O(N) 时间复杂度内的两个 R 字符。
所以你的输入将是 Array: [a,b,c,z,s,w,y,z,o]
and your output array will be: [a,b,c,R,R,s,w,y,R,R,o]
假设之前数组中没有“R”。
不允许使用其他 arrays 或其他变量。
该算法应该是在线算法。
您的最终数组必须是字符数组。”
我的解决方案在 O(N^2) 时间复杂度内,但在 O(N) 时间复杂度内有一个解决方案。
面试结束了,但是我还在想这个问题,谁能帮我解决这个问题?
首先扫描输入以计算 char 1 的出现次数。 这具有线性时间复杂度。
由此您知道最终数组的长度将是输入长度 + 出现次数。
然后将数组扩展到其新长度,将新插槽留空(或任何值)。 操作的确切性质取决于数组数据结构的实现方式。 这肯定可以在最坏的线性时间复杂度下完成。
使用两个索引i和j ,其中i引用输入数组的最后一个字符, j引用数组中的最后一个索引(可能指向一个空槽)。
每次将这些索引的值减一时,开始从i复制到j 。 如果您复制匹配的字母,则将复制的字符再次复制到j ,并且只减少j 。 这再次具有线性时间复杂度。
该算法将以i和j都等于 -1 结束。
做两次迭代。
首先,计算char1
的数量(在您的示例中为“z”)。
现在你知道你的数组应该多长了: array.size() + num_char1s
然后,go 从最后到第一个输入和 output 迭代器。 如果元素是char1
,则将新字符插入到迭代器的末尾,否则 - 只需复制。
伪代码:
num_char1s = 0
for x in array:
if x == char1:
num_char1s++
// Assuming array has sufficient memory already allocated.
out_iterator = num_char1s + size - 1
in_iterator = size - 1
while (in_iterator >= 0):
if (array[in_iterator] == char1):
array[out_iterator--] = char3
array[out_iterator--] = char2
else:
array[out_iterator--] = array[in_iterator]
in_iterator--
在你的问题中,有两件事非常重要。
所以,我们必须需要使用给定的数组。
复杂度:O(n)
不需要新的变量和数组
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.