计算将数字从m更改为n的最小步骤数

时间:2019-01-30 16:17:47

标签: algorithm language-agnostic

我在接受采访时被要求解决此问题:

  

给出2个数字mn,我们需要将数字m转换为n   最少执行以下操作:

     
      
  • -1 -减1
  •   
  • * 2 -乘以2
  •   
     

例如:如果为m=4n=6,则程序应输出2。

     
      
  • 第一个操作:-1 -> 4-1 = 3

  •   
  • 第二个操作:*2 -> 3 * 2 =6

  •   
     

两次操作后,我们可以将m(4)更改为n(6),答案是   2。

现在我不知道面试官对我的期望是什么,也不知道什么是合适的解决方案。

2 个答案:

答案 0 :(得分:4)

这是我在Java中的解决方案

public class Main {

public static void main(String[] args) {
    int m = 3;
    int n = 36;
    int counter = 0;
    float ntemp;

    if (m > n) {
        counter = m - n;
        System.out.println("result: " + counter);
        return;
    }

    while (m != n) {
        ntemp = n;
        while (m < ntemp) {
            ntemp = ntemp / 2;
        }
        if (m < ntemp + 1) {
            m = m * 2;
            System.out.println("*2");
        } else {
            m = m - 1;
            System.out.println("-1");
        }
        counter++;
    }
    System.out.println("result: " + counter);
}
}

说明:

下面我只考虑m = n的情况很明显。

1。如果2m> n

在这种情况下

a)如果2(m-1)= n->结束

b)如果2(m-1)

减去1后,我们的数字太小了。

我们可以改变不平等:

2(m-1) m

如果我们的数字太小,我们必须乘以2,但这不是最优的,因为我们必须减去2 *(m-1)倍(如果n为2 *(m-2)-1)奇数),因此减去1并不是一个好主意。

总结:对于m 乘以然后减去

2。如果2m n

经过一些运算(一个乘法和-1的某个数量)之后,我们要从步骤1接收结果满足条件:m

我们假设4m> n-> 2 * 2 * m> n-> 2m> n / 2。

当我们更改符号n / 2 = ntemp时,我们会收到相同的条件:

2m> ntemp,因此我们可以获得与步骤1中相同的结论。

3。如果x * m n,则x-iteger

每个数字m都可以像步骤2一样进行变换,并得出相同的结论。

P.S .:我知道这不是正式证明,对我的英语很抱歉:)

答案 1 :(得分:1)

您可以尝试以下方法:

def convert(m, n): 

    if(m == n): 
        return 0

    # only way is to do 
    # -1(m - n): times 
    if(m > n): 
        return m - n 

    # not possible 
    if(m <= 0 and n > 0): 
        return -1

    # n is greater and n is odd 
    if(n % 2 == 1): 

        # perform '-1' on m 
        #(or +1 on n): 
        return 1 + convert(m, n + 1) 

    # n is even 
    else: 

        # perform '*2' on m 
        #(or n/2 on n): 
        return 1 + convert(m, n / 2) 

# Driver code 
m = 3
n = 11
print("Minimum number of operations :", 
                          convert(m, n))