以最少的步骤将给定整数转换为另一个整数
Convert a given integer to another in minimum steps
给定两个位数相等的数字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++;
}
}
我无法在所有测试用例上获得正确答案。请提出一种有效的方法。
您的问题的解决方案是
- 逐位遍历 a 和 b,将差值的绝对值添加到变量总和中
- 总和表示需要更改的位数
- 时间复杂度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;
}
当然,性能可能会下降,但如果你想要更多可读的代码,这可能会更好。
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 如何在C++中将整数转换为其数字数组
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 将最小值整数转换为无符号长整型
- 为什么我们不能将使用异或运算找到的整数转换为字符?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 将74位整数转换为以31为底的整数
- 独立于实现的浮点/整数转换
- 以最少的步骤将给定整数转换为另一个整数
- 浮点到整数转换出错(即使浮点数已经是整数)
- 了解双精度转换与整数转换中的整数与截断关系
- 禁止具有精度损失的整数转换
- 将任意整数转换为 void*
- 将 32 位大端有符号整数转换为有符号小端整数
- char a[0] 使用 itoa() 将整数转换为字符串的目的
- 使用函数时从整数转换为字符串
- 尝试从整数转换为字符串的月份
- 如何在C++中将整数转换为字节,以便 Unity 在通过 UDP 传输后能够理解它们
- 如何将 Q 格式的整数转换为浮点数(反之亦然)
- 如何避免字符串到整数转换情况下的无效参数异常