【问题标题】:Produce all permutations of a number's digits产生一个数字的所有排列
【发布时间】:2014-02-27 15:07:30
【问题描述】:

我最近解决了一个问题,它需要一个 3-4 位数字,例如 1234,(以及一些更大的数字)并返回一个排序数组,其中包含所有可能的 permutations 数字 [1234, 1432, 4213, 2431, 3412, 3214, etc.]

我不喜欢我的解决方案,因为它使用 .times 将数字添加到数组中,因此仍然容易出错,而且丑陋。有没有一种方法可以将数字添加到数组中完美的次数,以便一旦达到所有可能的数字改组,程序就会停止并返回数组?

def number_shuffle(number)
  array = []
  number = number.to_s.split(//)
  1000.times{ array << number.shuffle.join.to_i}
  array.uniq.sort
end

【问题讨论】:

    标签: ruby arrays sorting split shuffle


    【解决方案1】:

    使用Array#permutation进行如下操作:

    >> a = 1234.to_s.chars
    => ["1", "2", "3", "4"]
    >> a.permutation(4).to_a
    => [["1", "2", "3", "4"],
     ["1", "2", "4", "3"],
     ["1", "3", "2", "4"],
     ["1", "3", "4", "2"],
     ["1", "4", "2", "3"],
     ["1", "4", "3", "2"],
     ["2", "1", "3", "4"],
     ["2", "1", "4", "3"],...]
    

    您修改后的方法将是:

    def number_shuffle(number,size)
      number.to_s.chars.permutation(size).to_a
    end
    

    【讨论】:

    • 啊,核心库提供了。如果您知道正确的术语,答案是多么容易。 :)
    • 如此真实@LeonidShevtsov - 知道这个名字肯定会有所帮助。
    • @ArupRakshit 你所说的排列部分是什么意思,如'a.permutation(4).to_a'?我已经通过 irb 运行了这个,它不明白。
    • @modulus a.permutation(4) 会给你Enumerator。现在调用#to_a,会将其转换为Array
    • 为什么创建无意义的变量?我发现number.to_s.chars.permutation(size).to_a 更容易阅读。
    【解决方案2】:

    对于您的方法,它将是:

    def number_shuffle(number)
      a = number.to_s.chars
      a.permutation(a.size).to_a.map { |b| b.join.to_i }
    end
    
    p number_shuffle 123 # => [123, 132, 213, 231, 312, 321]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多