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

时间:2017-08-28 06:39:14

标签: c++ algorithm pseudocode

给出两个数字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++;
        }

  }

我无法在所有测试用例中得到正确的答案。请建议一种有效的方法。

2 个答案:

答案 0 :(得分:6)

问题的解决方案是

  1. 逐位遍历a和b,将差值的绝对值加到变量sum
  2. sum表示需要更改的位数
  3. 时间复杂度O(位数)
  4. 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));

答案 1 :(得分:0)

基于@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; } 这是一个不起眼的标准容器,可以在这里完成它的工作。您可以运行它here

gremlin> a = graph.addVertex("name", "alice")
==>v[4208]
gremlin> b = graph.addVertex("name", "bobby")
==>v[40968424]
gremlin> c = graph.addVertex("name", "cindy")
==>v[4192]
gremlin> d = graph.addVertex("name", "david")
==>v[40972520]
gremlin> e = graph.addVertex("name", "eliza")
==>v[40964272]
gremlin> a.addEdge("rates",b,"tag","ruby","value",9)
==>e[2ry-38w-azv9-oe3fs][4208-rates->40968424]
gremlin> b.addEdge("rates",c,"tag","ruby","value",8)
==>e[odzq5-oe3fs-azv9-38g][40968424-rates->4192]
gremlin> c.addEdge("rates",d,"tag","ruby","value",7)
==>e[170-38g-azv9-oe6lk][4192-rates->40972520]
gremlin> d.addEdge("rates",e,"tag","ruby","value",6)
==>e[oe04d-oe6lk-azv9-oe08g][40972520-rates->40964272]
gremlin> a.addEdge("rates",e,"tag","java","value",9)
==>e[366-38w-azv9-oe08g][4208-rates->40964272]
gremlin> g.E().values("tag")
==>ruby
==>ruby
==>ruby
==>ruby
==>java
gremlin> graph.tx().commit()

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