使用Collections.shuffle()计算给定数字集合的一百万个不同的排列?

时间:2017-04-09 21:39:39

标签: java algorithm permutation

我目前正在对Euler项目进行练习,任务要求我找到一系列数字的百万位排列,现在我有两个选项可以定义我自己的算法来找到百万个排列或使用{{1}但是,我不确定Collections.suffle()方法是否有可能计算出100万个不同的排列。

百万分之一的数字是通过对所有排列进行排序来决定的,但你可以忽略这一部分。

我的问题:

是否可以使用Collections.suffle()生成一系列数字的100万个不同的排列?如果不是,您认为最佳方法或最佳方法可以产生一系列数字的100万个不同的排列?

这是Project Euler提供的内容:

  

数字的百万分之一的词典排列是什么:

Collections.shuffle()

请注意 - 我实际上并不希望有人为我解决这个问题。只是回答上面的问题就行了。谢谢。

2 个答案:

答案 0 :(得分:4)

collections.shuffle()只是以随机排列顺序对数组进行随机播放。由于您需要遵循词典顺序,因此无法使用collections.shuffle()。而且当使用collections.shuffle()排列次数时,不能保证你将拥有所有的排列,因为collections.shuffle()可以多次生成相同的排列。 对于你如何做,这里有一些很好的链接,解释如何使用阶乘数系统来做到这一点。 Find the N-th permutation of an ordered string (Using factorial number system).

答案 1 :(得分:0)

我认为这就是你要找的......

func keyboardWasShown(_ notification: Notification){
let oldOffset = self.tableViewChat?.tableView.contentOffset.y
    let info = (notification as NSNotification).userInfo
    let value = info?[UIKeyboardFrameEndUserInfoKey]

    if let rawFrame = (value as AnyObject).cgRectValue
    {
        let keyboardFrame = self.tableViewChat?.tableView.convert(rawFrame, from: nil)
        let keyboardHeight = keyboardFrame?.height
        self.bottomConstraint.constant = keyboardFrame!.size.height - (self.navigationController!.navigationBar.frame.height)
        self.sendButtonBottom.constant = self.bottomConstraint.constant

        let currentOffset = self.tableViewChat?.tableView.contentOffset.y

        self.tableViewChat?.tableView.setContentOffset(CGPoint(x: 0, y: (currentOffset! + keyboardHeight! - 52)), animated: true)
    }
}

使用递归在给定一组元素的情况下生成大小为n的所有唯一组合。