Пересечение множества с изюминкой Java

1

Поэтому я недавно получил следующий вопрос в техническом интервью, и я подумал, что это довольно интересно.

Для двух массивов: A = {1,2,2,4,5} и B = {1,2,6,} писать код, который выполняет следующие две операции: AB {2,4,5} и BA {6}, Значит, вы найдете общий элемент в другом массиве и удалите его из оригинала. Кроме того, если B было {1,2}, тогда BA было бы просто {}, так как A содержит все элементы B и B не имеет уникальных элементов.

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

public static void main(String args[]) {
Map hashtable = new HashMap();

int a[] = {1,1,2,4,5,6,6};
int b[] = {1,2,6};

ArrayList ba = new ArrayList();
ArrayList ab = new ArrayList(); 
int[] occurances = new int[a.length];
//int occurances = 0;
for (int i = 0; i < a.length; i++) {
    occurances[a[i]]++;
    hashtable.put(a[i], occurances[a[i]]);

}
//System.out.println(Arrays.toString(occurances));
System.out.println(hashtable);
//find BA
for (int i = 0; i < b.length; i++) {
    if(hashtable.containsKey(b[i])) {
        occurances[b[i]]--;
        hashtable.put(b[i], occurances[b[i]]);
    } else ba.add(b[i]);


}
for(int i = 0; i <a.length; i++) {
    if(hashtable.containsKey(a[i]) && occurances[a[i]] != 0) {
        ab.add(a[i]);
        occurances[a[i]]--;
        hashtable.put(a[i], occurances[a[i]]);

    }

}

System.out.println("AB = " + ab);
System.out.println("BA =" + ba);

 } 
 }

**** ИЗМЕНИТЬ ***** Я ошибочно назвал массивы наборами, когда я изначально задал вопрос. Поскольку массивы могут иметь повторяющиеся элементы, они по определению не являются Sets. Извините за путаницу.

  • 1
    Map hashtable хэш-таблицы .... мои глаза x_X
  • 4
    {1,2,2,4,5} не является набором.
Показать ещё 1 комментарий
Теги:
hashmap
runtime

2 ответа

2

Вы можете использовать Set которые имеют функции объединения и пересечения.

Integer a[] = {1, 2, 2, 4, 5};
Integer b[] = {1, 2, 6};

public void test() {
    // Grow the two sets from the arrays.
    Set<Integer> sa = Arrays.stream(a)
            .collect(Collectors.toCollection(TreeSet::new));
    Set<Integer> sb = Arrays.stream(b)
            .collect(Collectors.toCollection(TreeSet::new));
    // Make a new one so I don't damage sa or sb.
    Set<Integer> sc = new HashSet<>(sa);
    sc.removeAll(sb);
    System.out.println(sa + " - " + sb + " = " + sc);
    Set<Integer> sd = new HashSet<>(sb);
    sd.removeAll(sa);
    System.out.println(sb + " - " + sa + " = " + sd);
}

печать

[1, 2, 4, 5] - [1, 2, 6] = [4, 5]
[1, 2, 6] - [1, 2, 4, 5] = [6]
1

Это можно сделать только с помощью стандартных операций Set

Set<Integer> a; //assume initialized with {1,2,4,5}
Set<Integer> b; //assume initialized with {1,2,6}

a.removeAll(b);
System.out.println(a);

Должен дать:

[4, 5]

Если вы это сделаете:

b.removeAll(a);
System.out.println(b);

Тогда вы получите

[6]
  • 0
    К сожалению, это не работает для дубликатов. Если A равен {1,2,2,3} ab равен {2,4}, то AB должен быть {1,2,3} с удалением только одного, найденного в b. Операции set удаляют все вхождения 2 в a.
  • 1
    Что ж, тогда A = {1,2,2,3} по определению НЕ является множеством.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню