【问题标题】:java - find sequence of integers whose sum is that of a given numberjava - 查找总和是给定数字的整数序列
【发布时间】:2017-04-09 22:19:06
【问题描述】:

对于 n

class Test {
    public static void main(String args[]) {
        printAll(4);
    }

    public static void printAll(int k) {
        int count = 0;
        int a[] = new int[k];
        for (int i = 0; i < k; i++) {
            a[i] = 1;
        }
        int currentSum = 0;
        a[1] = 0;
        for (int i = 0; i < k; i++) {
            a[1]++;
            for (int j = 0; j < k - i; j++) {
                currentSum += a[i];
                count++;
                if (currentSum == k) {
                    for (int m = 0; m < count; m++) {
                        System.out.print(a[m] + " ");
                    }
                    System.out.println();
                }
            }
            count = 0;
        }
    }
}

对于 n = 4:

期望的输出:

    1 1 1 1
    1 2 1 
    1 3

我得到的输出:

    1 1 1 1

这实际上是代码的第一步。稍后我需要打印

    2 1 1
    2 2

所以基本上我的目标是在迭代的每个步骤中使总和等于 4(在这种情况下)

【问题讨论】:

  • 对于您想要的输出,是否需要按特定顺序排列?就像在第一个例子中一样:2 1 1 可以代替1 2 1 吗?
  • 是的,它应该与问题中给出的顺序相同。
  • 定义“整数序列”。它是某个给定序列的子序列吗?它是小于给定数字的任何整数集吗?
  • 这些序列之一的数学短语是“分区”。所以你想列出n所有分区。

标签: java algorithm


【解决方案1】:

有一个模式可以用来解决这个问题。

注意这一点:

example: 4 //i starts at 0 and increments 1
1 1 1 1 = 1 1+i 1 1  //4-i numbers
1 2 1   = 1 1+i 1    //4-i numbers
1 3     = 1 1+i      //4-i numbers

example: 8
1 1 1 1 1 1 1 1 = 1 1+i 1 1 1 1 1 1 //8-i numbers
1 2 1 1 1 1 1   = 1 1+i 1 1 1 1 1   //8-i numbers
1 3 1 1 1 1     = 1 1+i 1 1 1 1     //8-i numbers
1 4 1 1 1       //and so on...
1 5 1 1
1 6 1
1 7

//Now we introduce a new level, with 'j' (j was 0 in previous example, now it is 1)
//We add i to j in the second position in the array
2 1 1 1 1 1 1 = 1+j j+i 1 1 1 1 //8-j-i numbers
2 2 1 1 1 1   = 1+j j+i 1 1 1   //8-j-i numbers
2 3 1 1 1     = 1+j j+i 1 1     //8-j-i numbers
2 4 1 1       = 1+j j+i 1       //8-j-i numbers
2 5 1
2 6

把这个模式放在一起,我们只使用了两个不同的变量 i 和 j,所以我们可能只需要两个 for 循环。 (就像你一样。)

int exampleNumber = 8;
for (int j = 0; j < exampleNumber; j++)
{
    for (int i = 0; i < exampleNumber; i++)
    {

    }
}

接下来,我们知道我们从一个长度为 8-j 的数组开始,然后在 i 增加时收缩它。

int exampleNumber = 8;
for (int j = 0; j < exampleNumber; j++)
{
    int jLength = exampleNumber - j; //NewLine
    for (int i = 0; i < exampleNumber; i++)
    {
        int iArray = new int[jLength - i]; //NewLine
    }
}

现在我们只需要设置两个重要的数字。开头的那个和旁边的那个。

int exampleNumber = 8;
for (int j = 0; j < exampleNumber; j++)
{
    int jLength = exampleNumber - j;
    for (int i = 0; i < exampleNumber; i++)
    {
        int iArray = new int[jLength - i];
        iArray[0] = 1 + j; //NewLine
        iArray[1] = j + i; //NewLine
    }
}

最后,我们只需要打印我们拥有的东西。我们在数组为空的地方代入 1。

int exampleNumber = 8;
for (int j = 0; j < exampleNumber; j++)
{
    int jLength = exampleNumber - j;
    for (int i = 0; i < exampleNumber; i++)
    {
        int iArray = new int[jLength - i];
        iArray[0] = 1 + j;
        iArray[1] = j + i;
        //printIntArray(iArray);
    }
}

public void printIntArray(int[] printArray)
{
    for (int i = 0; i < printArray.length(); i++)
    {
        int numberToPrint = printArray[i];
        if (numberToPrint == null || numberToPrint == 0)
            numberToPrint = 1;
        System.out.print(numberToPrint + " ");
    }
    System.out.println();
}

【讨论】:

  • 没有模式会是这样的 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 3 1 1 1 1 1 4 1 1 1 1 5 1 1 1 6 1 1 7这基本上是当循环递增下一个模式时我要处理的第一次迭代将是 2 1 1 1 1 1 1 2 2 1 1 1 1 2 3 1 1 1 2 4 1 1 2 5 1 2 6依此类推......直到我们得到 8 作为唯一的集合
  • 可能也希望使用该模式编辑您的初始帖子。
  • 1 4 1 1 1 1 5 1 1 1 6 1 1 7 这基本上是我尝试处理的第一次迭代,当循环递增时,下一个模式将是 2 1 1 1 1 1 1 2 2 1 1 1 1 2 3 1 1 1 2 4 1 1 2 5 1 2 6 等等......直到我们得到 8 作为唯一的集合
  • 整数序列指的是各个循环中每次迭代的子集。
【解决方案2】:

这个不太复杂的解决方案怎么样:

public static void allSequencesSumToN(int n) {
    generate(n,"", n);
}

public static void generate(int no, String str, int orig) {
    if(no == 0) {
        System.out.println(str);
        return;
    }
    if(no < 0) {
        return;
    }
    for(int i = 1; i < orig ; i++) {
        waysUtil(no - i, str + i, orig);
    }

}

它可能与您需要的略有不同,但您可以调整结果。例如。输入 4,这将生成以下输出:

1111 112 121 13 211 22 31

所有可能的序列,但通过简单的后处理,您可以完全满足您的需求。

【讨论】:

    猜你喜欢
    • 2014-11-08
    • 2017-01-26
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2023-04-09
    • 2021-05-18
    相关资源
    最近更新 更多