【问题标题】:Modify only first n elements and return the modified array in ruby仅修改前 n 个元素并在 ruby​​ 中返回修改后的数组
【发布时间】:2020-07-12 19:12:14
【问题描述】:

我需要对数组的k 值集执行操作并返回修改后的数组。

我有一个array = [10,32,5,6,7]

让我们说k=2

我试图在这里只取前两个元素:

arr2=[]
array[0..k-1].each do |i|
 res=i.to_f/2.0
 arr2.push(res.round)
end

=>arr2=[5,16]

我想用arr2 值替换array 中的前两个元素。 如何在不必创建这么多新数组的情况下实现这一点。

【问题讨论】:

    标签: arrays ruby


    【解决方案1】:

    不需要遍历整个数组。

    array = [10,32,5,6,7]
    
    array[0, 2] = array[0, 2].map { |n| n/2.0 }
    array
      #=> [5.0, 16.0, 5, 6, 7] 
    

    2.times { |i| array[i] = array[i]/2.0 }
    array
      #=> [5.0, 16.0, 5, 6, 7] 
    

    以上反映了我对原始数组要进行变异的理解。如果数组不被突变,可以编写以下内容。

    array[0, 2].map { |n| n/2.0 }.concat(array[2..-1])
      #=> [5.0, 16.0, 5, 6, 7] 
    array
      #=> [10, 32, 5, 6, 7] 
    

    【讨论】:

      【解决方案2】:

      您不需要推送到新数组,为什么不这样做:

      array = [10,32,5,6,7]
      k = 2
      
      array[0..k-1].each_with_index do |val, indx|
        array[indx] = val / 2 # or whatever processing really
      end
      

      这是解决您的问题的一种简单方法,因为 .each_with_index 在这里完成工作,并允许您轻松修改初始数组。这将输出:

      [5, 16, 5, 6, 7]
      

      【讨论】:

        【解决方案3】:

        您当前的实施有什么问题?没什么,你只需要将数组中的其他元素相加即可:

        arr2=[]
        array[0..k-1].each do |i|
         res=i.to_f/2.0
         arr2.push(res.round)
        end
        arr2 + array[k..-1] # [5, 16, 5, 6, 7]
        
        • 只要你做integer.to_f / ...,你就可以做fdiv
        • 您可以使用map,而不是分配“备忘录”数组:
        arr2 = array[0..k-1].map do |i|
          res=i.to_f/2.0
          res.round
        end + array[k..-1]
        arr2 # [5, 16, 5, 6, 7]
        
        • 您可以使用独占范围0...k,而不是使用k - 1 来获取范围。

        你的代码看起来像(不修改array):

        array[0...k].map { |i| i.fdiv(2.0).round } + array[k..-1] # [5, 16, 5, 6, 7]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-30
          • 2021-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多