有一个问题说: 给定每张卡上的n和n个卡号,写入一个数字 我们有骰子,k次我们掷骰子,如果骰子显示的数字是m,那么我们必须划伤其中一个可被m分割的卡片数量 困难在于刮痕应该在O(1)
中完成我找不到解决方案,可能需要算法或特殊数据结构
如果有人可以帮助我,我会很高兴:)
TNX! :)
答案 0 :(得分:1)
如果您知道卡上的所有数字都是唯一的,您可以创建一个数组并将卡对象存储在数组中写入数字的索引上。抓一个数字就可以了
cardArray[number].scratch()
如果数字很大,你必须创建一个大数组,所以最好为它创建一个哈希值。
cards = {cardNumber:cardObject, ...}
cards[cardNumber].scratch
划分所有可由m分类的数字创建哈希,如下所示
dicemax = 6
scratched = {number: false; ....}
card.scratched? => return scratched[card.number % dicemax]
您可以使用划痕哈希跟踪滚动的数字。所以抓它们将在O(1)中,只需重写哈希的值。 检查卡是否被刮伤,你得到卡上的号码。并查看它的数量是模数最大值的模数。如果这个数字已被哈希划伤,那么卡片就会被划伤。