将数组中的“0”元素替换为其他数组保持索引和顺序的值

时间:2016-05-21 17:36:44

标签: arrays ruby replace

我有一个数字a的n个数字和其他数组b,其大小相同,填充为“0”,其他数组x包含要替换的第一个数组的元素。我想用数组x的顺序和位置替换数组b中的a元素。例如:

a = [10, 8, 6, 9, 12, 5, 3, 8, 4, 10, 7, 9, 6, 10, 4]

b = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

x = [5, 3, 8, 4, 10]

替换后b应为:

b = [0, 0, 0, 0, 0, 5, 3, 8, 4, 10, 0, 0, 0, 0, 0]

4 个答案:

答案 0 :(得分:1)

这是一个非常直接的解决方案:

haystack = [10, 8, 6, 9, 12, 5, 3, 8, 4, 10, 7, 9, 6, 10, 4]
needle = [5, 3, 8, 4, 10]

idx = haystack.each_cons(needle.size).find_index(needle)
raise "needle not found!" unless idx

zeroes = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
zeroes[idx, needle.size] = needle
p zeroes
# => [0, 0, 0, 0, 0, 5, 3, 8, 4, 10, 0, 0, 0, 0, 0]

请注意,这不是最有效的解决方案。它是 O(nm)(不包括初始化n - x.size数组,这不是免费的),而Boyer-Moore式搜索将是 O(n)< / em>经过预处理( O(m + k)),但如果您的数据很小,则上述内容应该非常合适。

答案 1 :(得分:0)

由于阵列中只有一个5。我建议你迭代一直到你找到5的位置。然后使用该索引将b中的值更改为所需的索引。

答案 2 :(得分:0)

def make_b(a,x)
  mx = a.size - x.size
  return nil if mx < 0
  idx = mx.times.find { |i| a[i,x.size] == x }
  return nil unless idx
  Array.new(a.size,0).tap { |ar| ar[idx, x.size] = x }
end

x = [5, 3, 8, 4, 10]

a = [10, 8, 6, 9, 12, 5, 3, 8, 4, 10, 7, 11, 6, 10, 4]
make_b(a,x)
  #=> [0, 0, 0, 0, 0, 5, 3, 8, 4, 10, 7, 0, 0, 0, 0] 

a = [10, 8, 6, 9, 12, 5, 3, 8, 4, 5, 3, 8, 4, 10, 4]
make_b(a,x)
  #=> [0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 8, 4, 10, 0]

a = [10, 8, 6, 9, 12, 5, 3, 8, 4, 13, 7, 11, 6, 10, 4]
make_b(a,x).nil?
  #=> true

答案 3 :(得分:0)

此解决方案仅需要使用ax(返回b),并对每个数组进行一次传递:

 i = 0
 a.map do |e|
   if e == x[i]
     i += 1
     x[i-1]
   else
     0
   end
 end