【问题标题】: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 我不认为它给出了任何特定的顺序。该示例似乎只是显示了将一个数字乘以它自己的数字的最短路径。

标签: arrays ruby algorithm


【解决方案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))
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多