Есть ли способ исключить неповторяющиеся числа в моем массиве без создания другого массива? - PullRequest
0 голосов
/ 05 апреля 2019

Мне нужно создать вывод, который принимает числа из двух массивов: a и b;и печатает уникальные, но только один раз.так, например, если было

int[] a = { 4,3,4,3,6,7,4,8,2,9 };
int[] b = { 2,3,6,8,1,5 };`

, то результат должен быть 7, 4, 9 НЕ 4, 4, 7, 4, 9

В задаче прямо говорится: «Не создавайте никаких вспомогательных массивов, коллекций или строк.. Не используйте никакие классы из пакетов, кроме стандартного java.lang. Массивы не могут быть изменены (в частности, они не могут быть отсортированы). Порядок печатных значений не имеет значения. "

У меня 90%из этого, я просто не могу получить массив, чтобы не повторять числа

public class Main {

    public static void main(String[] args)
    {
        int[] a = new int[]{1,2,12,2,3,4,5,6,7,8,9,7,123};
        int[] b = new int[]{2,1,3,6,4,5,8,9,12};



        for (int i=0;i<a.length;i++)
        {
         int count =0;
         for (int j=0;j<b.length;j++)
         {
            if(b[j]==a[i])count++;
         }
          if (count==0) System.out.print(a[i] + " ");
        }
    }

}

Я бы ожидал 7 123.В действительности это печатает 7 7 123.Я знаю, что это должно быть что-то сумасшедшее простое, но я только начинающий и пока не могу обернуться вокруг этого.

Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Вот один из способов найти уникальные элементы:

int[] a = new int[]{1, 2, 12, 2, 3, 4, 5, 6, 7, 8, 9, 7, 123};
int[] b = new int[]{2, 1, 3, 6, 4, 5, 8, 9, 12};

Stream<Integer> aStream = Arrays.stream(a).boxed();
Stream<Integer> bStream = Arrays.stream(b).boxed();

Set<Integer> intersection = aStream.collect(Collectors.toSet());
intersection.retainAll(bStream.collect(Collectors.toSet()));

Set<Integer> unique = Stream.concat(aStream, bStream).collect(Collectors.toSet());
unique.removeAll(intersection);

System.out.println(unique);

Результат будет:

[7, 123]
0 голосов
/ 05 апреля 2019

В приведенном выше коде вы проверяете, является ли текущий номер уникальным, и распечатываете его, но не проверяете, был ли номер уже использован. Поскольку мы не можем использовать какую-либо дополнительную структуру данных или изменять существующее содержимое, это единственный способ избежать печати уже используемого числа.


    public class Main {

        public static void main(String[] args)
        {
            int[] a = new int[]{1,2,12,2,3,4,5,6,7,8,9,7,123};
            int[] b = new int[]{2,1,3,6,4,5,8,9,12};



            for (int i=0;i<a.length;i++)
            {
             int count =0;
             for (int j=0;j<b.length;j++)
             {
                if(b[j]==a[i])count++;
             }
              if (count==0 && !visitedPreviously(i-1, a[i], arr)) System.out.print(a[i] + " ");
            }
        }

    private boolean visitedPreviously(int index, int val, int[] arr){
         while(index >= 0){
              if(val == arr[index]){
                 return true; 
              }
           index--;
         }
      return false;

    }

    }

...