返回找到相邻的重复数对所需的最少乘法次数

  • 本文关键字:返回 arrays ruby algorithm
  • 更新时间 :
  • 英文 :


我不是很擅长算法,我完全卡住了这个,没有能够找到我正在寻找的帮助。我想解决的问题如下:

让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)。

问题可以表述为"在决策树中找到最短路径"。其中每个决定都是"我应该使用哪位数字进行下一次乘法"。

由于这个决策树可以有无限长的路径(例如,从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))
}
}
}

Array Challenge让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,因为需要进行两次乘法才能找到一对相邻的重复数字(在本例中为5和5)。例子输入:8输出:3


<?php
// Input number
echo arrayChallenge(198);
function getDigits($num) {
return array_map('intval', str_split($num));
}
function getNum($arr) {
return intval(implode('', $arr));
}
function hasAdjacentPair($arr) {
$prev = null;
foreach ($arr as $val) {
if ($prev == $val) {
return true;
}
$prev = $val;
}
return false;
}
function arrayChallenge($num) {
if (hasAdjacentPair(getDigits($num))) {
return 0;
}
$check = array();
array_unshift($check, array(getDigits($num), 1));
while (true) {
list($digits, $multiplications) = array_shift($check);
foreach (array_unique($digits) as $digit) {
$multDigits = getDigits(getNum($digits) * $digit);
if ($digits[count($digits) - 1] == $multDigits[0] || hasAdjacentPair($multDigits)) {
return $multiplications;
}
array_push($check, array($multDigits, $multiplications + 1));
}
}
}
?>

最新更新