Другие языки программирования и технологии

C++, программирование, 1 курс.

Даны два упорядоченных неубывающих массива A[n] и B[m] . Найти кол-во чисел, которые встречаются только в одном массиве. Пожалуйста, не надо юзать операторы и функции, которые слишком круты для первака, такое запрещено пока что.
Фраза "упорядоченных неубывающих массива" означает, что массивы УЖЕ отсортированы в порядке увеличения значений. И при таких условиях задача решается за O(n+m).

Ставим курсоры на начало массивов. А дальше в цикле сравниваем значения под курсорами. Если значения различаются, увеличиваем счётчик и сдвигаем курсор, указывающий на меньший элемент. Если элементы равны - сдвигаем каждый курсор до первого отличающегося элемента.
Если один из массивов исчерпан - заканчиваем цикл и увеличиваем счётчик на на кол-во не просмотренных элементов другого массива.

i = 0;
j = 0;
count = 0;
while (i < n && j < m) {
if (a[i] < b[j]) {
++count;
++i;
} else if (b[j] < a[i]) {
++count;
++j;
} else {
val = a[i];
while (i < n && a[i] == val) { ++i; }
while (j < m && b[j] == val) { ++j; }
}
}
if (i < n) { count += n - i; }
if (j < m) { count += m - j; }
cout << count;

Но это будет искать кол-во вхождений чисел. Т. е. a[] = {1, 1}, b[] = {2} даст ответ 3. Если же надо найти кол-во УНИКАЛЬНЫХ значений, то принцип остаётся тем же, но сначала убираем из массива дубли:

for(i = 0, j = 1; j < n; ++j) { if (a[i] != a[j]) { a[++i] = a[j]; }
n = i + 1;
for(i = 0, j = 1; j < m; ++j) { if (b[i] != b[j]) { b[++i] = b[j]; }
m = i + 1;
i = 0;
j = 0;
count = 0;
while (i < n && j < m) {
if (a[i] < b[j]) {
++count;
++i;
} else if (b[j] < a[i]) {
++count;
++j;
} else {
++i;
++j;
}
}
if (i < n) { count += n - i; }
if (j < m) { count += m - j; }
cout << count;
НС
Николай Симбирцев
97 318
Лучший ответ
Максим Гафуров -----------------------------------------------------------------------
for(i = 0, j = 1; j < n; ++j) { if (a[i] != a[j]) { a[++i] = a[j]; }
n = i + 1;
for(i = 0, j = 1; j < m; ++j) { if (b[i] != b[j]) { b[++i] = b[j]; }
m = i + 1;
i = 0;
j = 0;
------------------------------------------------------------------------
Извините, а можно вот это подробнее ?
Максим Гафуров Там еще скобок не хватает
Максим Гафуров Как понять "убираем дубли" ?
А где ваше решение? Что тут у вас не получается? Какие ошибки выдает?
ИБ
Иван Бурдин
15 408
Максим Гафуров Решение я и делать не стал, потому что знаю только, как делать полным перебор сначала элементы А, потом Б (как сами понимаете, там сложность проги будет о-го-го, 2n^2). А надо сделать по-эффективному, а алгоритм я не знаю.