【问题标题】:How to split an array into 3?如何将一个数组分成3个?
【发布时间】:2015-08-26 01:20:11
【问题描述】:

我有一个包含 9 个元素的数组,我想将所有可能的元素分成 3 个。

我该怎么做?

为了更好地理解,请选择 3 of 9,然后选择 3 of 6,其余的将放在最后。并且有 1680 种可能性。我想要它们。

【问题讨论】:

  • 你能给我们你的背景吗?它可能会有所帮助。我很好奇。
  • 例如我有一个这样的数组:[1,2,3,4,5,6,7,8,9] 我想像这样拆分 [1,2,3] , [4,5,6], [7,8,9] 和 [1,2,5], [4,3,6], [7,8,9]。希望你越来越好。
  • 我的意思是你能告诉我们你为什么要这么做吗?
  • 你想如何分割你的数组?你想每连续3个数字吐一次然后分裂吗?
  • 最好的学习方法是自己动手

标签: java arrays


【解决方案1】:

这更像是一个排列问题而不是 Java 问题,但基本上你可以计算 { 0,1,2,3,4,5,6,7,8 } 的所有排列,一旦你得到排列第一个 3 作为你的第一个数组,第二个 3 作为你的第二个数组,最后 3 个作为你的第三个数组。顺便说一句,我选择了 0-8 而不是 1-9,因为数组索引从 0 开始。

例如,第一个排列是 0,1,2,3,4,5,6,7,8。我把它分成三个部分/数组,[0,1,2],[3,4,5],[6,7,8]。

我并不是说这是最好的方法,也不是说这段代码已经过优化,但这是一个有趣的谜题。 :)

public class Permutations
{
    private boolean[] used;
    private StringBuilder out = new StringBuilder();
    private final String in;
    private String[] originalArray = { "a", "b", "c", "d", "e", "f", "g", "h", "i" }; // this can be changed to any array, e.g. int[]

    public static void main(String[] args)
    {
        Permutations p = new Permutations("012345678");
        p.permute();
    }

    public Permutations(final String str)
    {
        in = str;
        used = new boolean[in.length()];
    }

    public void permute()
    {
        if (out.length() == in.length())
        {
            System.out.println("Permutation: " + out);
            loadArrays(out);
            return;
        }

        for (int i = 0; i < in.length(); ++i)
        {
            if (used[i])
                continue;
            out.append(in.charAt(i));
            used[i] = true;
            permute();
            used[i] = false;
            out.setLength(out.length() - 1);
        }
    }

    public void loadArrays(StringBuilder p)
    {
        String[] array1 = new String[3];
        String[] array2 = new String[3];
        String[] array3 = new String[3];
        array1[0] = originalArray[Integer.parseInt(p.substring(0, 1))];
        array1[1] = originalArray[Integer.parseInt(p.substring(1, 2))];
        array1[2] = originalArray[Integer.parseInt(p.substring(2, 3))];
        array2[0] = originalArray[Integer.parseInt(p.substring(3, 4))];
        array2[1] = originalArray[Integer.parseInt(p.substring(4, 5))];
        array2[2] = originalArray[Integer.parseInt(p.substring(5, 6))];
        array3[0] = originalArray[Integer.parseInt(p.substring(6, 7))];
        array3[1] = originalArray[Integer.parseInt(p.substring(7, 8))];
        array3[2] = originalArray[Integer.parseInt(p.substring(8, 9))];

        System.out.println(String.format("Array1: [%s,%s,%s]", array1[0], array1[1], array1[2]));
        System.out.println(String.format("Array2: [%s,%s,%s]", array2[0], array2[1], array2[2]));
        System.out.println(String.format("Array3: [%s,%s,%s]", array3[0], array3[1], array3[2]));
        System.out.println();
    }
}

顺便说一句,有 362880 个排列而不是 1680。:)

【讨论】:

  • 请记住 [1,2,3],[4,5,6],[7,8,9] 与 [3,2,1],[6, 5,4],[9,8,7]
  • 我看到了他对此的评论,但他似乎并没有过分担心,所以我并不太担心。如果您的意图是学习 Java,我不确定这是一个好问题......这更多是关于找到一个好的数学解决方案,恕我直言。 :)
  • 同意。我的解决方案非常笨拙,但完全可以。如果我花更多时间在这上面,我可能会做某种排列的交集来删除重复项
【解决方案2】:

最幼稚的方法,但可能比删除排列的排列更有效,如下所示:

for (int a = 0; a < 9; a++) {
    for (int b = a + 1; b < 9; b++) {
        for (int c = b + 1; c < 9: c++) {
            for (int d = 0; d < 9; d++) {
                //make sure we haven't used these values
                if (d == a || d == b || d == c)
                    continue;
                for (int e = d + 1; e < 9; e++) {
                    if (e == a || e == b || e == c)
                        continue;
                    for (int f = e + 1; f < 9; f++) {
                        if (f == a || f == b || f == c)
                            continue;
                        //group the already used values
                        int used = {a, b, c, d, e, f};
                        //create the first and second triplets
                        String[] first = {originalArray[a], originalArray[b], originalArray[c]};
                        String[] second = {originalArray[d], originalArray[e], originalArray[f]};
                        int g = -1;
                        int h = -1;
                        int i = -1;
                        //find the values that haven't been used
                        for (int j = 0; j < 9; j++) {
                            boolean found = false;
                            for (int k = 0; k < used.length; k++) {
                                if (j == used[k]) {
                                    found = true;
                                    break;
                                }
                            }
                            if (!found) {
                                if (g < 0) {
                                    g = j;
                                } else if (h < 0) {
                                    h = j;
                                } else if (i < 0) {
                                    i = j;
                                }
                            }
                        }
                        //create the third triplet
                        String[] third = {originalArray[g], originalArray[h], originalArray[i]};
                    }
                }
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 2012-01-07
    • 2021-06-02
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多