我有一个数字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]
答案 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)
此解决方案仅需要使用a
和x
(返回b
),并对每个数组进行一次传递:
i = 0
a.map do |e|
if e == x[i]
i += 1
x[i-1]
else
0
end
end