返回找到相邻的重复数字对所需的最少乘法次数
Posted
技术标签:
【中文标题】返回找到相邻的重复数字对所需的最少乘法次数【英文标题】:Returning the least number of multiplications it took to find an adjacent pair of duplicate numbers 【发布时间】:2021-12-08 10:16:36 【问题描述】:我对算法不是很好,我完全被困在这个问题上,无法找到我正在寻找的帮助。我要解决的问题如下:
让函数 ArrayChallenge(num) 获取传递的 num 参数并执行以下步骤。首先取输入数字的所有单个数字(始终是大于 1 的正整数)并将它们中的每一个添加到列表中。然后取输入数字并乘以它自己的任何一个整数,然后取这个新数字并将每个数字附加到原始列表中。继续此过程,直到列表中出现相邻的相同数字对。您的程序应该返回找到相邻重复数字对所需的最少乘法次数。
示例:如果 num 为 134,则首先将每个整数附加到一个列表中:[1, 3, 4]。现在,如果我们将 134 乘以 3(这是它自己的整数之一),我们得到 402。现在,如果我们将这些新整数中的每一个附加到列表中,我们得到: [1, 3, 4, 4, 0 , 2]。我们找到了一对相邻的重复数字,即 4 和 4。因此对于这个输入,您的程序应该返回 1,因为它只需要 1 次乘法就可以找到这对。
示例:如果 num 是 46,那么我们将这些整数附加到一个列表中:[4, 6]。如果我们将 46 乘以 6,我们得到 276,并将这些整数附加到我们现在拥有的列表中:[4,6,2,7,6]。然后,如果我们将这个新数字 276 乘以 2,我们得到 552。将这些整数附加到列表中,我们得到:[4, 6, 2, 7, 6, 5, 5, 2]。因此,您的程序应该返回 2,因为它需要 2 次乘法才能找到一对相邻的重复数字(在本例中为 5 和 5)。
【问题讨论】:
选择乘数的规则是什么?为什么6
在第一轮,为什么2
在第二轮?如果必须进行第三轮,乘数会是多少?
添加了更多说明@engineersmnky。
@spickerman 我不认为它给出了任何特定的顺序。该示例似乎只是显示了将一个数字乘以它自己的数字的最短路径。
【参考方案1】:
这个问题可以表述为“在决策树中寻找最短路径”。每个决定都是“我应该在下一个乘法中使用哪个数字”。
由于此决策树可以有无限长的路径(例如,从 12 开始并始终乘以 1),我们不能使用简单的深度优先搜索,而是应该实现广度优先方法。
这意味着,如果我们达到预期的结果,我们应该首先检查每个数字,如果没有记下乘法结果。然后,如果我们没有找到一对,继续记录每个记下的数字及其数字,依此类推。
我在 kotlin 中将其作为示例实现,但您应该能够轻松地将其转换为任何语言:
fun Int.getDigits() = toString().map it.toString().toInt()
fun List<Int>.getNum() = joinToString("").toInt()
fun List<Int>.hasAdjacentPair() = zipWithNext().any (a, b) -> a == b
fun arrayChallenge(num: Int): Int
if (num.getDigits().hasAdjacentPair()) return 0
val check = mutableListOf(Pair(num.getDigits(), 1))
while (true)
val (digits, multiplications) = check.removeFirst()
for (digit in digits.distinct())
val multDigits = (digit * digits.getNum()).getDigits()
if (digits.last() == multDigits.first() || multDigits.hasAdjacentPair())
return multiplications
check.add(Pair(multDigits, multiplications + 1))
【讨论】:
以上是关于返回找到相邻的重复数字对所需的最少乘法次数的主要内容,如果未能解决你的问题,请参考以下文章