Другие языки программирования и технологии
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;
Ставим курсоры на начало массивов. А дальше в цикле сравниваем значения под курсорами. Если значения различаются, увеличиваем счётчик и сдвигаем курсор, указывающий на меньший элемент. Если элементы равны - сдвигаем каждый курсор до первого отличающегося элемента.
Если один из массивов исчерпан - заканчиваем цикл и увеличиваем счётчик на на кол-во не просмотренных элементов другого массива.
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;
А где ваше решение? Что тут у вас не получается? Какие ошибки выдает?
Максим Гафуров
Решение я и делать не стал, потому что знаю только, как делать полным перебор сначала элементы А, потом Б (как сами понимаете, там сложность проги будет о-го-го, 2n^2). А надо сделать по-эффективному, а алгоритм я не знаю.
Похожие вопросы
- Программирование. 1 курс.
- Что нужно знать на 1 курсе программирования в вузе? Чему учат на 1 курсе?
- В школах изучают программирование, везде курсы бесплатные для программистов. Почему большинство людей еще не пидо
- Можно ли выучить любой один язык программирования на курсах? А не в универах и институтах?
- с чего начать изучение программирования? Литература, курсы итд ..
- C# программирование, задачи циклы, помоги очень прошу!!! =)
- C++ программирование. Булевые (логические) переменные.
- Подскажите как можно научиться программированию без курсов?
- Целесообразно ли при обучении программированию включать курс ассемблера?
- Почему в России такая плохая система образования, особенно программирования и курсы, и вузы и колледжи дерьмо?
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;
------------------------------------------------------------------------
Извините, а можно вот это подробнее ?