首页 > 解决方案 > 如何在java中打印3的子集?

问题描述

我正在学习我的大学提供的一门课程,并在其中一个代码挑战中遇到问题。

问题是: 编写一个 Java 代码来打印所有大小为 3 的子集。

样本输入:

arr_size = 5

arr[] = {1, 7, 3, 4, 9}

样本输出:

(1, 7, 3) (1, 7, 4) (1, 7, 9) (1, 3, 4) (1, 3, 9) (1, 4, 9)

(7, 3, 4) (7, 3, 9) (7, 4, 9)

(3, 4, 9)

我为此编写的代码:

import java.util.Scanner;
class Main{
    public static void main(String args[]) {
       // Type your code here
      Scanner in = new Scanner(System.in);
      int n = in.nextInt();
      int a[] = new int[n];
      for(int i=0; i<n;i++)
        a[i] = in.nextInt();
      for(int i=0;i<n;i++)
      {
        for(int j=i+1;j<n;j++)
        {
          for(int k = j+1; k<n; k++)
          {
            System.out.print("(" + a[i] + ", " + a[j] + ", " + a[k] + ") ");

          }
        }
        if(i<2)
          System.out.print("\n");
      }
    }
}

我的输出与预期输出匹配,但网站显示错误。我不知道我哪里错了。有谁能够帮我??

这是我的输出和预期输出的屏幕截图:

标签: javasubset

解决方案


问题是因为下面提到的三个问题:

  1. 无条件地将空格(在末尾)放在以下行中:

    System.out.print("(" + a[i] + ", " + a[j] + ", " + a[k] + ") ");
    

    空格应该只在两个子集之间,而不是在一行的末尾。写如下:

    if (j < n - 2) {
        System.out.print("(" + a[i] + ", " + a[j] + ", " + a[k] + ") ");
    } else {
        System.out.print("(" + a[i] + ", " + a[j] + ", " + a[k] + ")");
    }
    

    如果您对三元运算符感到满意,则可以将其写在一行中,如下所示:

    System.out.print("(" + a[i] + ", " + a[j] + ", " + a[k] + (j < n - 2 ? ") " : ")"));
    
  2. 错误的迭代次数:

    以下声明中的条件导致循环运行超过所需的时间,因此,即使在所需的输出完成后,它也会导致打印换行符。请注意,如果n数组中有元素,则输出的行数应该是 only n-2,而且换行符应该只打印n-3几次(最后一行的换行符不是必需的)。

    for (int i = 0; i < n; i++)
    

    将其替换为

    for (int i = 0; i < n - 2; i++)
    
  3. 断线的错误条件:

    i<2以下条件仅在数组中有5元素但尝试使用或更多元素的情况下才导致换行符7,您将能够理解它导致了什么问题。

    if(i<2)
    

    将其替换为

    if (i < n - 3)
    

    除此之外,我还建议您更换

    System.out.print("\n");
    

    System.out.println();
    

    或与

    System.out.printf("%n");    
    

    因为推荐的版本使用平台的首选行分隔符输出换行符,而System.out.print("\n")这是一种蛮力方式(即强制系统\n用作行分隔符),这对于某些平台可能是一个问题。

    以下代码包含所有这些建议:

    import java.util.Scanner;
    
    class Main {
        public static void main(String args[]) {
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            int a[] = new int[n];
            for (int i = 0; i < n; i++)
                a[i] = in.nextInt();
            for (int i = 0; i < n - 2; i++) {
                for (int j = i + 1; j < n; j++) {
                    for (int k = j + 1; k < n; k++) {
                        System.out.print("(" + a[i] + ", " + a[j] + ", " + a[k] + (j < n - 2 ? ") " : ")"));
                    }
                }
                if (i < n - 3)
                    System.out.println();
            }
        }
    }
    

    示例运行:

    7
    1 2 3 4 5 6 7
    (1, 2, 3) (1, 2, 4) (1, 2, 5) (1, 2, 6) (1, 2, 7) (1, 3, 4) (1, 3, 5) (1, 3, 6) (1, 3, 7) (1, 4, 5) (1, 4, 6) (1, 4, 7) (1, 5, 6) (1, 5, 7) (1, 6, 7)
    (2, 3, 4) (2, 3, 5) (2, 3, 6) (2, 3, 7) (2, 4, 5) (2, 4, 6) (2, 4, 7) (2, 5, 6) (2, 5, 7) (2, 6, 7)
    (3, 4, 5) (3, 4, 6) (3, 4, 7) (3, 5, 6) (3, 5, 7) (3, 6, 7)
    (4, 5, 6) (4, 5, 7) (4, 6, 7)
    (5, 6, 7)
    

推荐阅读