TestDome:我的解决方案有效,但我只获得%50而不是%100?

时间:2015-10-04 11:57:59

标签: java algorithm

这是情景问题:

青蛙只向前移动,但它可以步长1英寸或跳跃2英寸长。青蛙可以使用不同的步骤和跳跃组合覆盖相同的距离。

编写一个函数,计算青蛙可以用来覆盖给定距离的不同组合的数量。

例如,可以通过三种方式覆盖3英寸的距离:步进步骤,步进跳跃和跳跃步骤。

public class Frog{
public static int numberOfWays(int input) {

    int counter = 2;

    int x = 0;

    for (int i = 1 ; i< input -1; i++ ){

        x = i + counter;
        counter = x; 
    }
    if (input <3){
        x = input;

    }
    return x;

  }

public static void main(String[] args) {
    System.out.println(numberOfWays(10));
 }
}

这个解决方案只给了我50%不确定为什么它不是%100,我用其他值测试它并返回正确的结果。

5 个答案:

答案 0 :(得分:7)

我认为递归是一种很好的解决问题的方法

public int numberOfCombinations(int distance) {
    if (distance == 1) {
        return 1; //step
    } else if (distance == 2) {
        return 2; // (step + step) or jump
    } else {
        return numberOfCombinations(distance - 1) + numberOfCombinations(distance - 2); 
       // we jumped or stepped into the current field
    }
}

答案 1 :(得分:4)

f[n]为步数和跳跃组合的数量,使您行进n英寸。您可以立即看到f[n] = f[n-1] + f[n-2],首先您可以以某种方式行驶n-1英寸然后使用1步,或者您可以以某种方式行驶n-2英寸然后使用1跳。自f[1] = 1f[2] = 2后,您可以看到f[n] = fib(n+1)n+1 - Fibonacci number。如果符合此目的,您可以在linear time中进行计算,或者更有效地,您可以在log n时间内计算出来reference

答案 2 :(得分:2)

问题是Fibonacci系列的修改版本。我得到100%以下(对不起它的C#,但非常相似):

using System;

public class Frog
{
    public static int NumberOfWays(int n)
    {

        int firstnumber = 0, secondnumber = 1, result = 0;  

            if (n == 1) return 1;
            if (n == 2) return 2;


            for (int i = 2; i <= n + 1; i++)  
            {  
                result = firstnumber + secondnumber;  
                firstnumber = secondnumber;  
                secondnumber = result;  
            }  

            return result;  

    }

    public static void Main(String[] args)
    {
        Console.WriteLine(NumberOfWays(3));
        Console.WriteLine(NumberOfWays(4));
        Console.WriteLine(NumberOfWays(5));
        Console.WriteLine(NumberOfWays(6));
        Console.WriteLine(NumberOfWays(7));
        Console.WriteLine(NumberOfWays(8));
    }
}

答案 3 :(得分:1)

考虑重叠的子问题/动态编程。您需要记住对子问题的重复调用,这将永远为您节省时间。

答案 4 :(得分:0)

我相信这应该涵盖您的所有情况。

    public static string numberOfCombinations(int distance) 
    {
        if (distance == 1) {
            return "Step";//1
        } else if (distance == 2) {
            return "Jump";//2
        } else{
            return numberOfCombinations(1) + numberOfCombinations(distance - 1); 
        }
    }