Учитывая два списка A и B, и B - анаграмма A. B - анаграмма A, означает, что B сделан путем рандомизации порядка элементов в A. Мы хотим найти отображение индекса P, от A до BОтображение P [i] = j означает, что i-й элемент в A появляется в B с индексом j.Эти списки A и B могут содержать дубликаты.
Например, если дано
A = [12, 28, 46, 32, 50] B = [50, 12, 32, 46, 28]. Мы должны вернуть [1, 4,3, 2, 0]
Мое решение - O (n ^ 2)
public int[] anagramMappings(int[] A, int[] B) {
int[] result = new int[100];
int count = 0;
for (int i = 0; i < A.length; i++) {
for (int j = 0; j < B.length; j++) {
if (A[i] == B[j]) {
result[i] = j;
count++;
break;
}
}
}
int[] tempArray = new int[count];
for (int i = 0; i < count; i++) {
tempArray[i] = result[i];
}
return tempArray;
}
Вот еще одно решение, которое, я думаю, более эффективно, чем приведенное выше.Я говорю это, потому что я тестировал оба фрагмента с разными выходами и первый фрагмент почти всегда выполнялся быстрее.
Пожалуйста, поясните, почему первый фрагмент быстрее, чем второй фрагмент.Я считаю, что 2-й более эффективен при сложности O (n)
public int[] anagramMappingsx(int[] A, int[] B) {
int[] res = new int[A.length];
int index = 0;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < B.length; i++) {
if (!map.containsKey(B[i])) {
map.put(B[i], i);
}
}
for (Integer i : A) {
if (map.containsKey(i)) {
res[index++] = map.get(i);
}
}
return res;
}