计算将数字从 m 更改为 n 的最少步骤数
Count the minimum number of steps to change a number from m to n
我正在面试,被要求解决这个问题:
Given 2 numbers m
& n
and we need to convert a number m
to n
with minimum number of the following operations:
- -1 - Subtract 1
- *2 - Multiply by 2
For e.g. : if m=4
and n=6
, the program should output 2.
1st operation : -1 -> 4-1 = 3
.
2nd operation : *2 -> 3 * 2 =6
.
As we can Change m
(4) to n
(6) after 2 operations, the answer is
2.
现在我不知道面试官对我有什么期望,也不知道什么是合适的解决方案。
这是我在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 的情况,因为给定 m >= n 的情况是显而易见的。
1.如果 2m > n
在这种情况下
a) 如果 2(m-1) = n -> 结束
b) 如果 2(m-1) < n
减 1 后数字太小了。
我们可以改变不平等:
2(m-1) < n -> m < n/2 + 1
如果我们的数字太小,我们必须乘以 2,但这不是最优的,因为我们必须减去 2*(m-1) 次(或 2*(m-2)-1如果 n 是奇数),那么这意味着减去 1 不是个好主意。
总结:对于 m < n/2 + 1 -> 相乘然后相减
2。如果 2m < n 和 4m > n
经过一些操作(一次乘法和一些 -1)后,我们希望从步骤 1 中接收满足条件的结果:m < n/2 + 1(因为我们必须再次乘法)。
我们假设 4m > n - > 2*2*m > n -> 2m > n/2.
当我们更改符号 n/2 = ntemp 时,我们收到相同的条件:
2m > ntemp,所以我们可以得到与步骤1相同的结论。
3。如果 x*m < n 且 2*x*m > n,则 x-iteger
我们可以像步骤 2 那样对每个数字 m 进行变换,并得到相同的结论。
P.S.: 我知道这不是正式证明,对不起我的英语:)
你可以试试这个:
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))
我正在面试,被要求解决这个问题:
Given 2 numbers
m
&n
and we need to convert a numberm
ton
with minimum number of the following operations:
- -1 - Subtract 1
- *2 - Multiply by 2
For e.g. : if
m=4
andn=6
, the program should output 2.
1st operation :
-1 -> 4-1 = 3
.2nd operation :
*2 -> 3 * 2 =6
.As we can Change
m
(4) ton
(6) after 2 operations, the answer is 2.
现在我不知道面试官对我有什么期望,也不知道什么是合适的解决方案。
这是我在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 的情况,因为给定 m >= n 的情况是显而易见的。
1.如果 2m > n
在这种情况下
a) 如果 2(m-1) = n -> 结束
b) 如果 2(m-1) < n
减 1 后数字太小了。
我们可以改变不平等:
2(m-1) < n -> m < n/2 + 1
如果我们的数字太小,我们必须乘以 2,但这不是最优的,因为我们必须减去 2*(m-1) 次(或 2*(m-2)-1如果 n 是奇数),那么这意味着减去 1 不是个好主意。
总结:对于 m < n/2 + 1 -> 相乘然后相减
2。如果 2m < n 和 4m > n
经过一些操作(一次乘法和一些 -1)后,我们希望从步骤 1 中接收满足条件的结果:m < n/2 + 1(因为我们必须再次乘法)。
我们假设 4m > n - > 2*2*m > n -> 2m > n/2.
当我们更改符号 n/2 = ntemp 时,我们收到相同的条件:
2m > ntemp,所以我们可以得到与步骤1相同的结论。
3。如果 x*m < n 且 2*x*m > n,则 x-iteger
我们可以像步骤 2 那样对每个数字 m 进行变换,并得到相同的结论。
P.S.: 我知道这不是正式证明,对不起我的英语:)
你可以试试这个:
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))