【问题标题】:how to print subsets of 3 in java?如何在java中打印3的子集?
【发布时间】:2020-05-28 08:42:00
【问题描述】:

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

问题是: 编写 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");
      }
    }
}

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

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

【问题讨论】:

  • '我的输出匹配'-'但显示错误'可以解释吗?
  • @azro 如果这类似于 HackerRank 问题,那么 OP 可能已经生成了正确的输出,但 HR 仍然被拒绝,因为它使用了三个嵌套循环的蛮力方法(无法扩展非常适合任意大小的集合)。
  • 您是否向右滚动了输出框?未完全显示
  • 我看不到输出,但你真的使用( ... ) 而不是{ ... } 用于sets
  • 也许,只是预期输出中不存在的尾随空格导致检查失败?如果您不打印该行的最后一个元素,请尝试仅打印最后一个空格。

标签: java subset


【解决方案1】:

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

  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 元素,则输出的行数应仅为n-2,并且换行符应仅打印n-3 次(最后一行的换行符不是必需的)。

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

    替换为

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

    以下情况仅在 i&lt;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)
    

【讨论】:

    【解决方案2】:

    我认为匹配的想法在最后一行的情况下不打印结束空格

    检查以下示例

    for(int i=0 ; i<a.length; i++){
        for(int j=i+1 ; j<a.length; j++){
            for(int k=j+1 ; k<a.length; k++){
                // print the 3 elements
                System.out.print("(" + a[i] + ", " + a[j] + ", " + a[k] + ")");
    
                // not print ending space in case of the last pair in th line  
                if( ! (j==a.length-2 && k == a.length-1) ){
                   System.out.print(" "); 
                }
            }
        }
        if(i<2) {
            System.out.println();   
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-14
      • 2017-11-06
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      相关资源
      最近更新 更多