需要帮助来发现我的java代码中的缺陷

时间:2014-10-27 15:11:04

标签: java recursion

我正在完成一项学校作业,我有以下问题:

我获得了许多棍棒(长度不同或相似),我的任务是找出形成给定长度的较长棍棒所需的最小棍数。

例如, 给定6根长度1,1,1,1,1,3以形成长度为5的长棍,输出为3。 注意:棒不能重复使用。

但是,如果不能形成给定长度,则输出-1。 例如, 给定3根长度为1,2,6的棍子,形成长度为5的长棍子,输出为-1。

我有以下代码,它已通过所有公共测试用例。但是,我没有通过私人测试案例,我无法弄清楚我的错误。

这是我的代码:

import java.util.*;

class Result {
    static int min = 100000;

    public static int solve(int pos, int currSum, int len, int numStk) {
        // implementation
        for (int i=1; i<=Stick.data.length - pos; i++){
            if (currSum > len){
                continue;
            }

            else if (currSum < len){
                if (pos+i >= Stick.data.length){
                    break;
                }
                else{
                    solve(pos+i,currSum+Stick.data[pos+i], len, numStk+1);
                }
            }

            else if (currSum == len){
                if (numStk < min){
                    min = numStk;
                }
            }
        }

        return min;
    }
}

class Stick {
    static int[] data;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int sticks = sc.nextInt();
        data = new int[sticks];
        int len = sc.nextInt(); 
        for (int i=0; i<sticks; i++){
            data[i] = sc.nextInt();
        }

        for (int i=0; i<sticks; i++){
            Result.solve(i,0,len,1);
        }

        if (Result.min == 100000){
            System.out.println(-1);
        } else {
            System.out.println(Result.min-1);  
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我注意到你的代码:

  1. Bug:主要是

    Result.solve(i,0,len,1);

    假设持有i(因此numsticks = 1在参数列表中),但currSum为0.不应该是data[i]

  2. 更好的代码质量:对currSum > lencurrSum == len的检查可以在for循环之外完成,这样更有效。