我在接受采访时被要求解决此问题:
给出2个数字
m
和n
,我们需要将数字m
转换为n
最少执行以下操作:
- -1 -减1
- * 2 -乘以2
例如:如果为
m=4
和n=6
,则程序应输出2。
第一个操作:
-1 -> 4-1 = 3
。第二个操作:
*2 -> 3 * 2 =6
。两次操作后,我们可以将
m
(4)更改为n
(6),答案是 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
1。如果2m> n
在这种情况下
a)如果2(m-1)= n->结束
b)如果2(m-1) 减去1后,我们的数字太小了。 我们可以改变不平等: 2(m-1) 如果我们的数字太小,我们必须乘以2,但这不是最优的,因为我们必须减去2 *(m-1)倍(如果n为2 *(m-2)-1)奇数),因此减去1并不是一个好主意。 总结:对于m 2。如果2m 经过一些运算(一个乘法和-1的某个数量)之后,我们要从步骤1接收结果满足条件:m 我们假设4m> n-> 2 * 2 * m> n-> 2m> n / 2。 当我们更改符号n / 2 = ntemp时,我们会收到相同的条件: 2m> ntemp,因此我们可以获得与步骤1中相同的结论。 3。如果x * m 每个数字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))