【问题标题】:Ruby algorithm solvingRuby算法求解
【发布时间】:2016-01-26 07:32:39
【问题描述】:

所以我有一个基本问题需要解决。我需要采用以下嵌套数组 [1, 2, ["str", 1], [[2]]] 并返回 [1,2,"str",1,2]。最终删除所有嵌套数组。以下是我不完整的解决方案:

test = [1, 2, ["str", 1], [[2]]]

def remove_array(array)
    new_array = []
    array.each do |item|
        if item != Array
            puts "you are here"
            new_array << item
        else
            remove_array(item)
        end
    end
end

remove_array(test)

这是一种经典的递归方法。但是,我似乎想不出如何维护new_array。每次我将作为数组的项目传递给它时,new_array 都不会保持其状态。我还想指出,我知道内置方法flatten,因为我试图在没有上述方法的情况下解决解决方案。任何建议将不胜感激。

【问题讨论】:

  • 您是想从头开始实施,还是一个简单的答案就足够了?

标签: arrays ruby algorithm


【解决方案1】:
def my_flatten(arr)
  result = []

  arr.each do |el|
    if el.is_a?(Array)
      result.concat(my_flatten(el))
    else
      result << el
    end
  end

  result
end

您的想法通常是正确的,但您从未将内部数组元素添加到结果中。

【讨论】:

    【解决方案2】:
    def remove_array(array)
      new_array = []
      array.each do |e|
        if e.is_a?(Array)
          new_array += remove_array(e)
        else
          new_array << e
        end
      end
      new_array
    end
    

    【讨论】:

    • 我理解+= 的含义,但我不明白new_array += remove_array(e) 如何保留new_array 的状态。你能解释一下吗?
    • 保持new_array的状态是什么意思?如果array是[1, [2, 3]]并且e是[2, 3],那么此时new_array是[1]。 remove_array(e) 返回 [2, 3],因此 new_array += [2, 3] 将 [2, 3] 附加到 [1],因此 new_array 变为 [1, 2, 3]。 += 和 Array#concat 基本一样。
    • 您解释的方式对如何检索结果很有意义。谢谢。
    【解决方案3】:

    您可以在您的阵列上调用flatten

    a = [1, 2, ["str", 1], [[2]]]
    => [1, 2, ["str", 1], [[2]]]
       a.flatten
    => [1, 2, "str", 1, 2]
    

    【讨论】:

      【解决方案4】:

      在 Ruby 中,有一个方便的内置方法,称为 flatten

      它将“展平”你的数组,使所有内部数组消失,并返回一个包含所有元素的数组

      编辑:

      抱歉编辑此内容。忘记了您正在为您的解决方案使用递归。由于您实际上是在每次递归创建一个新数组,因此我不确定目前如何解决您的解决方案。

      【讨论】:

        【解决方案5】:

        只需使用扁平化! :) 保持简单..

        test = [1, 2, ["str", 1], [[2]]]
        
        def remove_array(array)
           array.flatten!
           return array
        end
        
        remove_array(test)
        
        2.2.1 :024 >   remove_array(test)
        => [1, 2, "str", 1, 2]
        
        I hope this helps everybody! Thanks
        

        【讨论】:

          猜你喜欢
          • 2011-06-12
          • 1970-01-01
          • 2012-06-10
          • 2013-04-16
          • 2014-09-25
          • 2013-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多