Arrays 替换“;0“;数组中的元素,其值来自保持索引和顺序的其他数组
我有一个由n个数字组成的数组Arrays 替换“;0“;数组中的元素,其值来自保持索引和顺序的其他数组,arrays,ruby,replace,Arrays,Ruby,Replace,我有一个由n个数字组成的数组a,另一个数组b,大小相同,用“0”填充,另一个数组x替换第一个数组的元素。我想用数组a的顺序和位置替换数组b中x的元素。例如: 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,
a
,另一个数组b
,大小相同,用“0”填充,另一个数组x
替换第一个数组的元素。我想用数组a
的顺序和位置替换数组b
中x
的元素。例如:
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]
因为数组a中只有一个5。我建议你遍历a,直到找到a中5的位置。然后使用该索引在所需索引处更改b中的值。
def make_b(a,x)
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
mx=a.size-x.size
如果mx<0,则返回nil
idx=mx.times.find{i | a[i,x.size]==x}
返回零,除非idx
new(a.size,0).tap{| ar | ar[idx,x.size]=x}
结束
x=[5,3,8,4,10]
a=[10,8,6,9,12,5,3,8,4,10,7,11,6,10,4]
制造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]
制造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]
使b(a,x)为零?
#=>正确
这里有一个非常简单的解决方案:
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
数组,这不是免费的),并且在预处理(O(m+k))后,a样式的搜索将是O(n),但是如果您的数据很小,上面的内容应该非常合适。此解决方案只需要使用a
和x
(b
返回),并对每个阵列进行一次扫描:
i = 0
a.map do |e|
if e == x[i]
i += 1
x[i-1]
else
0
end
end
不太清楚你在问什么。如果在
a
中找不到x
或者多次找到它,会发生什么情况?是否有任何原因导致b全部为零?是否可以回答硬码零并忽略b
数组?如果不是,那么如果b
中有不同的值(例如b=[0,1,2,…]
),问题就会更清楚