将具有n个元素的ArrayLists填充到特定总和

时间:2016-08-10 22:44:46

标签: java arraylist

目前我正在完成我书中的一些练习,其中我解决了保加利亚单人纸牌的问题(该章是关于阵列和arraylists)。

基本的想法是从一个数字列表(随机大小)开始,只要它们总和为45,说20, 5, 1, 9, and 10你给一个并创建另一个堆栈,如下所示

20, 5, 1, 9, and 10 -> 19, 4, 8, 10, and 5.

最后,如果你继续这样做,你会得到像

这样的堆栈
1, 2, 3, 4, 5, 6, 7, 8, and 9

我遇到问题的第一次开始时遇到问题,我在arraylist中填充了特定数量的项目,只要它们总和为45.以下是我的代码

class organizeCards
{
    private int sum;
    private Random randNum;
    private boolean flag;
    private ArrayList<Integer> nums;
    public organizeCards()
    {
        sum = 0;
        randNum = new Random();
        flag = true;
        nums = new ArrayList<Integer>();
    }

    public void fillArrList()
    {
        int nextNum = 0;
        while(flag)
        {
            int thisRandNum = randNum.nextInt(45 - nextNum) + 1;
            System.out.println(thisRandNum);
            nums.add(thisRandNum);
            sum+=thisRandNum;
            nextNum = thisRandNum;
            if(sum == 45)
            {
                flag = false;
            }
        }
    }

}

继承我的问题(我知道我的问题,只是不确定如何解决它)

我的代码正在执行以下操作。

首先从1-45获取一个随机数,比如30

现在为45-30 = 15,因此下一个随机数可以来自1-15

现在说8

现在我们的兰特号码来自1-7这个过程会不断重复,但最终还是会赢。如果我继续添加这些我的总和45

我的逻辑中缺少什么?

编辑(哎呀我在自己的代码中将sum&gt; 45加入)

目前,我的程序有时结束并给我一个适当大小的arraylist。但往往永远不会终止。

1 个答案:

答案 0 :(得分:3)

查看您的代码:

while(flag)
    {
        int thisRandNum = randNum.nextInt(45 - nextNum) + 1;
        System.out.println(thisRandNum);
        nums.add(thisRandNum);
        sum+=thisRandNum;
        nextNum = thisRandNum;
        if(sum == 45)
        {
            flag = false;
        }
    }

在这里,您要从nextNum中减去45以获得达到的最大数量。但是,您希望做的是减去random()函数生成的所有先前数字的总和。

更改了代码:

while(flag)
{
    int thisRandNum = randNum.nextInt(45 - nextNum) + 1;
    System.out.println(thisRandNum);
    nums.add(thisRandNum);
    sum+=thisRandNum;
    nextNum = sum;
    if(sum == 45)
    {
        flag = false;
    }
}