У меня было интервью на днях с Amazon, и вопрос, который они задавали мне, касался следующей проблемы.
Для двух целых массивов, содержащих любое количество элементов, как положительных, так и отрицательных, найдите числа, которые появляются в обоих массивах.
Мне удалось легко решить эту проблему с помощью HashMaps
, поэтому у него будет O(n)
вычислительная сложность, но, к сожалению, это также будет иметь сложность пространства O(n)
. Это можно сделать без дополнительной памяти путем повторения всех элементов в каждом массиве, но это будет O(n^2)
.
Интервьюер после того, как я закончил объяснение метода HashMap
, спросил, могу ли я думать о методе, который был бы O (n), вычисляемым, но не использовал бы лишнюю память. Я не мог думать ни о чем на лету, и не смог найти решение для этого. Есть ли способ найти эти значения без использования дополнительной памяти в линейном времени?
Примечание. Я задал этот вопрос в CareerCup, но все, похоже, не поняли, что мне нужно, чтобы он не использовал лишнее пространство и что он должен быть O(n)
вычислительным.
Вот код, который я использовал во время интервью. Он работает, но просто не O (1) для пробела.
import java.util.*;
public class ArrayFun {
public static void main(String[] args) {
int[] a = {1,2,3,4};
int[] b = {2,5,6,7,3,2,2,2,2,1,2,2,2,2};
ArrayList<Integer> matches = ArrayFun.findMatches(a,b);
for (int i = 0;i<matches.size();++i) {
System.out.println(matches.get(i));
}
}
public static ArrayList<Integer> findMatches(int[] a, int[] b) {
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
ArrayList<Integer> matches = new ArrayList<Integer>();
for (int i = 0;i<a.length;++i) {
map.put(a[i],0);
}
for (int i = 0;i<b.length;++i) {
if (map.get(b[i]) != null && map.get(b[i]) == 0) {
map.put(b[i],1);
matches.add(b[i]);
}
}
return matches;
}
}
Этот код вернет
1,2,3
EDIT: также, когда я не говорю о дополнительном пространстве, и O (1), я использую их взаимозаменяемо. Без дополнительного пространства я имею в виду, что небольшие переменные-заполнители хороши, но выделение новых массивов не является.