Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 替换“;0“;数组中的元素,其值来自保持索引和顺序的其他数组_Arrays_Ruby_Replace - Fatal编程技术网

Arrays 替换“;0“;数组中的元素,其值来自保持索引和顺序的其他数组

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,

我有一个由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, 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,…]
),问题就会更清楚