【问题标题】:How to replace a specific character in an array with two characters如何用两个字符替换数组中的特定字符
【发布时间】:2021-04-07 00:16:51
【问题描述】:

所以我刚从工作面试回来,我不得不面对的一个问题是:

"例如给定一个字符数组和三个字符:

数组:[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]

你的输出数组将是:[a,b,c,R,R,s,w,y,R,R,o]

假设之前数组中没有'R'。

您不能使用其他数组或其他变量。

算法应该是在线算法。

您的最终数组必须是字符数组。"

我的解决方案在 O(N^2) 时间复杂度内,但在 O(N) 时间复杂度内有一个解决方案。

面试结束了,但是我还在想这个问题,谁能帮我解决这个问题?

【问题讨论】:

  • 您是否假设输入数组有足够的长度来支持新元素,或者是动态数组?

标签: arrays string algorithm char


【解决方案1】:

在您的问题中,有两件事非常重要。

  1. 不能使用新变量
  2. 无法使用新数组

所以,我们必须使用给定的数组。

  1. 首先,我们将给定的数组大小增加一倍。为什么?最多导致我们的新数组大小 = given_array_size*2 (如果所有字符 = char 1)
  2. 现在我们将将给定数组向右移动 n 次,其中 n= given_array_size。
  3. 现在我们将从新的移位位置 = n 迭代我们的数组。 迭代 i=n 到 2*n-1
  4. 我们将取 j=0,这将写入新数组。 如果我们找到 char 1,我们将 使数组[j++]=char 2 和数组[j++]=char 3。
  5. 但如果一个字符不是“z”,我们就什么也不做。 数组[j++]=数组[i]
  6. 最后 0 到 j-1 是正确答案。

复杂度:O(n)
不需要新的变量和数组

【讨论】:

    【解决方案2】:

    首先扫描输入以计算 char 1 出现的次数。这具有线性时间复杂度。

    由此可知,最终数组的长度为输入长度+出现次数。

    然后将数组扩展到它的新长度,将新插槽留空(或任何值)。操作的确切性质取决于数组数据结构的实现方式。这肯定可以在最坏的线性时间复杂度下完成。

    使用两个索引,ij,其中i引用输入数组的最后一个字符,j 引用数组中的最后一个索引(可能指向一个空槽)。

    开始从 i 复制到 j 每次将这些索引的值减一。如果复制匹配的字母,则将复制的字符再次复制到j,并且只减少j。这又具有线性时间复杂度。

    算法将以 ij 都等于 -1 结束。

    【讨论】:

      【解决方案3】:

      进行两次迭代。

      首先,计算char1s 的数量(在您的示例中为“z”)。
      现在您知道数组的末尾应该有多长了:array.size() + num_char1s

      然后,使用输入和输出迭代器从最后一个到第一个。如果元素是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) 时间复杂度内,但是现在我明白它需要 O(N) ,真可惜。感谢您快速而精彩的回答!
      • 我唯一要改变的是循环 num_char1s != 0 并在双替换分支中减少 num_char1s。这将在最后一次需要替换后提前退出循环。
      猜你喜欢
      • 2012-04-18
      • 2017-11-17
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2017-04-08
      • 2021-02-26
      相关资源
      最近更新 更多