#arrays #language-agnostic #comparison
#массивы #не зависит от языка #сравнение
Вопрос:
Допустим, у вас есть два массива (псевдокод):
arrayA = [ "a", "b", "c", "d" ];
arrayB = [ "b", "c", "d", "e" ];
Возможно ли найти unique items to arrayA
(arrayA.a), common items
(b, c, d) и unique items to arrayB
(arrayB.e), используя только два цикла во вложенном формате?
Мы можем определить первые две цели как таковые:
// Loop over arrayA
for (itemA in arrayA) {
// Loop over arrayB
for (itemB in arrayB) {
// Assume that arrayA.itemA does not exist in arrayB by default
exists = false;
// Check for matching arrayA.itemA in arrayB
if (itemA == itemB) {
// If true set exists variable and break the loop
exists = true;
break;
}
}
// Tells us if an item is common
if (exists) {
// Do something
}
// The additional condition we need to determine (item is unique to array b)
else if () {}
// Tells us if the item is unique to arrayA
else {
// Do something else
}
}
Вопрос: Можем ли мы сделать шаг дальше и определить третье условие (элемент уникален для arrayB)? Хитрость заключается в том, чтобы иметь возможность выполнять третье условие на итерации первого цикла.
Циклы могут быть в любом формате (do while, do, for, for in) и в любой комбинации.
Комментарии:
1. Хэш-таблицы позволили бы быстро решить эту проблему — черт возьми, даже один «видимый» бит для элементов в arrayB сделал бы свое дело! Итак, какие операции вам разрешено выполнять в циклах, кроме обращений к массиву и встроенных операторов? Нет?
2. @Kilian, извините, я кое-что пропустил. Вы должны быть в состоянии выполнить условие на итерации первого цикла.
Ответ №1:
Вы могли бы достичь этого, удалив общие элементы из arrayB при их обнаружении. Таким образом, arrayB будет содержать только свои элементы unqiue.
Это также повысит эффективность дальнейших проверок. Обратите внимание, что алгоритм необходимо будет изменить, если arrayA содержит повторяющиеся элементы.
if (itemA == itemB) {
// If true set exists variable and break the loop
exists = true;
arrayB.remove(ItemB);
break;
}
Комментарии:
1. извините, смотрите Мой обновленный вопрос! Вы должны быть в состоянии выполнить условие в течение первой итерации цикла
2. @Mohamad В таком случае кажется, что то, что вы пытаетесь сделать, ошибочно. К какому элементу в arrayB вы попытались бы получить доступ в цикле для arrayA? Сначала вам нужно проверить ВСЕ элементы в arrayA, чтобы определить, какие элементы являются общими в arrayB и, следовательно, какие уникальны. Я бы сказал, что это невозможно, но, пожалуйста, раскройте мое мнение и докажите, что я неправ.
3. возможно, я непреднамеренно злоупотребил здесь загадкой «тега». На самом деле я не знаю, возможно ли это. Вот почему я спросил. Я перефразирую вопрос.
4. @Mohamad С условиями, которые вы навязываете, я не думаю, что это возможно. Попытка сделать это таким образом кажется тривиальной, есть ли здесь реальная проблема, которую вы пытаетесь преодолеть, или это просто игра?
5. это не игра. Хотя я знаю, что проблему легко решить, используя дополнительный цикл для остальных элементов в arrayB (как в вашем примере). Мне просто было любопытно посмотреть, есть ли способ сделать это в двух циклах, используя любую комбинацию типов циклов. Я некоторое время обдумывал это в своей голове и не мог найти способ. Я хотел посмотреть, возможно ли это, и другие знали способ. Тогда, вероятно, следует закрыть этот вопрос.
Ответ №2:
Второе условие (элемент уникален для массива b) всегда будет false, поскольку в этот момент вы перебираете элементы в A. Однако, чтобы ответить на ваш первый вопрос о построении 3 массивов с 2 циклами во вложенном формате, вот что я бы сделал:
//Set up the arrays to hold the values
uniqueA = itemA;//copy of item A
uniqueB = itemB;//copy of item B
common = [];
//Iterate through the arrays to populate the values
for (itemA in arrayA) {
for (itemB in arrayB) {
if(itemB == itemA){
comon.add(itemA);
uniqueA.remove(itemA);
uniqueB.remove(itemB);
break;
}
}
}
Обратите внимание, что вы могли бы утверждать, что копирование itemA
и itemB
повторяется через них. Единственный способ, который я вижу в этом случае, — это если вы не заботитесь о сохранении начальных значений массива, а значения уникальны, и в этом случае вы можете использовать arrayA
и arrayB
вместо uniqueA
и uniqueB
соответственно.