以最少的步骤将给定整数转换为另一个整数

Convert a given integer to another in minimum steps

本文关键字:整数 转换 另一个      更新时间:2023-10-16

给定两个位数相等的数字A和B。通过在每一步中增加或减少 A 中的一位数字来查找将 A 转换为 B 的最小步骤数。
例如:如果 A = 133 且 B = 343,则可能的解决方案为 133 -> 233 -> 333 -> 343。所需的最小步骤数为 3。

我尝试了蛮力方法。这是我的伪代码

while(a!=b)
{
if(a<b)
{
find (b-a)
count number of digits in (b-a) keep it as n
add the power(10,n) to a
moves++;
}
else{
find (a-b)
count number of digits in (a-b) keep it as n
subtract the power(10,n) from a
moves++;
}
}

我无法在所有测试用例上获得正确答案。请提出一种有效的方法。

您的问题的解决方案是

  1. 逐位遍历 a 和 b,将差值的绝对值添加到变量总和中
  2. 总和表示需要更改的位数
  3. 时间复杂度O(位数(

function solve(a, b){
let sum = 0;
while(a>0 && b>0){
sum += Math.abs((a%10)-(b%10));
a = Math.floor(a/10);
b= Math.floor(b/10);
}
return sum;
}
console.log(solve(133, 343));
console.log(solve(1234, 1221));

根据 @K. Kirsz 评论和@marvel308答案的想法,您可以通过std::valarray解决这个问题,这是一个晦涩难懂的标准容器,在这里做它的工作。您可以在此处运行它。

#include <iostream>
#include <valarray>
#include <string>
int solve(int a, int b)
{
std::valarray<char> va(std::to_string(a).data(), std::to_string(a).length());
std::valarray<char> vb(std::to_string(b).data(), std::to_string(b).length());
return (std::abs(va - vb)).sum();
}
int main()
{
int a, b;
std::cin >> a >> b;
std::cout << solve(a, b);
return 0;
}

当然,性能可能会下降,但如果你想要更多可读的代码,这可能会更好。