有人可以告诉我我做错了什么吗

时间:2020-09-06 08:01:06

标签: java

我在采访中遇到一个问题,一个男人可以后退或向前移动两倍的距离。将它们视为单个动作,找出他可以从x到达y的最小动作。

import java.util.*;
import java.io.*;

public class Main
{
    public static int Solve(int x,int y)
    {
        if(x==0)
        {
            return Integer.MAX_VALUE;
        }
        else if(x==y)
        {
            return 0;
        }
        else if(x==1)
        {
            return 1+Solve(x*2,y);
        }
        return Math.min(1+Solve(x*2,y),1+Solve(x-1,y));
    }
    
    public static void main(String[] args) 
    {
        Scanner sc=new Scanner(System.in);
        int x=sc.nextInt();
        int y=sc.nextInt();
        int z=Solve(x,y);
        System.out.print(z);
    }
}

2 个答案:

答案 0 :(得分:0)

这是一个无限循环。将在什么地方求解(x * 2,y) 停止吗?

由于定义了int x和int y,因此假设所有这些仅在一个轴(1D)中。假设我们有x和y,如果y-x为正,则意味着我们必须前进。现在,如果y-x为奇数,则假设7表示我们必须先前进8步(4 * 2),然后再返回1(1步)。给我们5个步骤。所以我们必须去

(((y-x) + 1)/2) + 1

所以7 + 1 = 8,我们向前走了8步,走了两步,然后又走了1步。 如果是偶数,则意味着我们可以继续前进!所以

(y-x)/2

如果y-x为负,则意味着我们必须返回。唯一的办法是后退1个(x-1),这样就可以了

-(y-x) steps. 

您可以编写代码。我喜欢您的代码的递归方面,但是如果是一维,那就太过分了。

答案 1 :(得分:0)

不确定此处是否需要基于递归的解决方案。

我们在这里有两个子问题:

    from >= to 时,
  1. 计数移回
  2. 否则,考虑到差异to - from为奇数的情况下,计数向前移动:则需要再向前移动1次,向后退1步。

这可以在三元运算符的帮助下解决:

public static int findMoveCount(int from, int to) {
    return from >= to ? from - to : (to - from) % 2 * 2 + (to - from)/2;
}