У меня есть два массива
int arr1 [] = {4, 6, 2, 6, 4, 8, 12, 14, 18, 4, 38};
int arr2 [] = {4, 2, 8, 6, 18, 12};
Arr1 содержит все значения arr1, иногда несколько.
Arr2 содержит каждое значение только один раз.
Порядок элементов в arr1 должен быть таким же, как порядок элементов в arr2.
Элементы, находящиеся в arr1, но не в arr2, должны добавляться в конец в том же порядке.
Вот как они должны выглядеть в итоге:
new arr1[] = {4, 4, 4, 2, 8, 6, 6, 18, 12, 14, 38};
Вот что я пробовал:
int [] temp = new int [arr1.length];
for (int i = 0; i<arr.length; i++){
if (arr2[i] == arr1[i]){
temp[arr2[i]] == arr1[i];
}
}
for (int k = 0; k<arr1.length; k++){
arr1[k] == temp[k];
arr2[k] == k;
}
1 ответ
Вы можете сделать это без использования алгоритма сортировки, за время O(n) и вспомогательное пространство O(n). Хитрость заключается в том, чтобы подсчитать, сколько раз каждый элемент arr2
встречается в карте, а затем использовать подсчеты, чтобы записать столько копий в arr1
, используя arr2
, чтобы получить их правильно. заказ.
Чтобы сохранить тот же порядок элементов, отсутствующих в arr1
, сохраните их в списке, а не подсчитывайте, а затем запишите их обратно в arr1
в конце.
import java.util.*;
class Solution {
public static void sortArrayByOtherArray(int[] arr1, int[] arr2) {
Map<Integer, Integer> counts = new HashMap<>();
List<Integer> extras = new ArrayList<>();
// initialise counter Map
for(int x : arr2) {
counts.put(x, 0);
}
// count occurrences, and populate extras list
for(int x : arr1) {
if(counts.containsKey(x)) {
counts.put(x, counts.get(x) + 1);
} else {
extras.add(x);
}
}
// write c copies of each x, in order from arr2
int i = 0;
for(int x : arr2) {
int c = counts.get(x);
for(int j = 0; j < c; ++j) {
arr1[i++] = x;
}
}
// write the extras
for(int x : extras) {
arr1[i++] = x;
}
}
}
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
Arrays.sort(...)
с использованием компаратора, который использует второй массив для определения возвращаемого значения метода сравнения, также будет хорошо работать здесь.int arr1 [] = {4, 6, 2, 6...
int arr2 [] = {4, 2, 8, 6...
они не в порядке?