У меня есть два массива

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
asaea 18 Ноя 2019 в 04:22
Если бы это была моя проблема, я бы попытался разработать алгоритм с помощью карандаша и бумаги, а затем зафиксировал его в коде. Вам нужно будет вложить циклы, чтобы быть уверенным,... поработайте над этим, и вы придумаете что-то, что, даже если это не принесет решения, по крайней мере, позволит вам улучшить вопрос.
 – 
Hovercraft Full Of Eels
18 Ноя 2019 в 04:25
3
На самом деле, вызов Arrays.sort(...) с использованием компаратора, который использует второй массив для определения возвращаемого значения метода сравнения, также будет хорошо работать здесь.
 – 
Hovercraft Full Of Eels
18 Ноя 2019 в 04:25
Порядок элементов в arr1 должен быть таким же, как порядок элементов в arr2. int arr1 [] = {4, 6, 2, 6... int arr2 [] = {4, 2, 8, 6... они не в порядке?
 – 
FailingCoder
18 Ноя 2019 в 04:25
Как бы я использовал такой компаратор?
 – 
asaea
18 Ноя 2019 в 04:27

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;
        }
    }
}
1
kaya3 18 Ноя 2019 в 04:44