как напечатать подмножества 3 в java? - PullRequest
0 голосов
/ 28 мая 2020

Я изучаю курс, предлагаемый моим колледжем, и сталкиваюсь с проблемой в одной из задач кода.

Вопрос: Напишите код 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)

Код I написал для этого:

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");
      }
    }
}

Мои выходные данные совпадают с ожидаемыми, но сайт показывает неверные данные. Я не знаю, где я ошибся. Кто-нибудь может мне помочь ??

Вот скриншот моего результата и ожидаемого результата:

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Проблема возникает из-за трех проблем, упомянутых ниже:

  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. Неверное количество итераций:

    Условие в следующем объявлении приводит к тому, что l oop выполняется больше, чем требуется, и, как результат, это также приводит к тому, что разрывы строк печатаются даже после завершения требуемого вывода. Обратите внимание, что если у вас есть n элементов в массиве, количество строк вывода должно быть только 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)
    
0 голосов
/ 28 мая 2020

Я думаю, что идея сопоставления не печатать конечный пробел в случае последней пары в строке

Проверьте следующий образец

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();   
    }
}
...