java - 检查 Java 数组中的总和

标签 java arrays

我正在用 Java 做一个名为“三十”的骰子游戏。我有一个数组,其中包含骰子的值,例如 [1, 3, 4, 5, 5, 6]。我希望能够从该数组中找到给出给定总和的每个组,但每个骰子只能计算一次。

例如,如果我有数组 [1, 3, 4, 5, 5, 6] 并且想要找到每个等于 12 的组,那么就会得到 1+5+6=12 和 3+4 +5=12。

以 [1, 1, 1, 1, 2, 6] 为例,我将得到 1+1+1+1+2+6=12。

总会有 6 个骰子,但我要寻找的总和可以是 4 到 12 之间的任意值。

有人可以帮我吗?我实际上没有任何代码可以提供,这只会令人困惑并且根本没有帮助。

最佳答案

这是一个没有经过充分测试且可能有点幼稚的解决方案。我使用整数列表,因为我不喜欢数组,抱歉!

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

public class PickNumbersTest {

    private List<Integer> numbers;

    @Before
    public void before() {
        Integer[] ints = new Integer[] { 1, 3, 4, 5, 5, 6 };
        numbers = new ArrayList<>();
        numbers.addAll(Arrays.asList(ints));        
    }

    @Test
    public void test() {

        PickNumbers p = new PickNumbers();
        List<List<Integer>> result = p.pick(12,  numbers);

        System.out.println(result);
    }
}

import java.util.ArrayList;
import java.util.List;

public class PickNumbers {

    public List<List<Integer>> pick(final int sum, final List<Integer> values) {

        // make a copy to avoid making changes to passed in List
        List<Integer> numbers = copy(values);

        List<List<Integer>> results = new ArrayList<List<Integer>>();

        while (!pickSingle(sum, numbers).isEmpty()) {

            List<Integer> currentResult = pickSingle(sum, numbers);

            results.add(currentResult);
            currentResult.forEach(i -> numbers.remove(i));

        }

        return results;
    }

    protected List<Integer> pickSingle(final int sum, final List<Integer> values) {
        int rest = sum;
        List<Integer> result = new ArrayList<>();
        Picker p = new Picker(values);

        while (rest > 0 && p.hasNext()) {

            int i = p.next();

            if (i > rest) {
                p.remove();
            } else if (i == rest) {
                result.add(i);
                return result;
            } else { // i < rest
                result.add(i);
                p.remove();
                rest = rest - i;
            }
        }

        return new ArrayList<>();
    }

    private List<Integer> copy(final List<Integer> values) {

        List<Integer> copy = new ArrayList<Integer>();
        copy.addAll(values);

        return copy;
    }
}

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Picker {

    private List<Integer> values = new ArrayList<Integer>();

    public Picker(final List<Integer> values) {

        this.values.addAll(values);
        this.values.sort(null);
        Collections.reverse(this.values);
    }

    public int next() {

        return values.get(0);
    }

    public void remove() {

        values.remove(0);
    }

    public boolean hasNext() {

        return values.size() > 0;
    }
}

关于java - 检查 Java 数组中的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38202410/

相关文章:

java - 'opentracing: spring: web: ignoreAutoConfiguredSkipPatterns: true' 是做什么的?

java - JButtons 直到悬停在面板上才会加载?

java - Java中字符串的加法和减法

javascript - Mongoose 查找并创建多维数组

c++ - 删除指针成员变量的数组内存

java - 没有JDK可以发邮件吗?

java - 使用 jack android 重新部署后生成的类出现 ClassNotFoundException

javascript - 如何在javascript中为两个数组的每个循环使用一个?

android - Json 数组解析在 Android 中总是有 null 结果

c++ - 快速将双指针数组转换为单指针,可能可以是连续的