Интервьюер разрушил мою жизнь таким вопросом сегодня.
У вас есть массив из миллиона целых чисел, и вам нужно отсортировать их по остатку.
1. Вы не знаете, какое целое число они делят на.
2. Вы не можете использовать классы, такие как Comparator, чтобы помочь.
3. Петли как можно меньше.
4. Имейте в виду сохранение памяти.Array Сортировать по Остальное
Например
int[] ints = {5434, 3454, 2, 0, 356, 896, 7324, 888, 99, 78365, 111};
int divider = 27;
Был бы
int[] int2 = {0, 2, 111, 356, 896, 5434, 7324, 78365, 99, 888, 3454};
Метод, который я придумал петли = делитель/2.
Это работает, но если делитель равен 250, то это петли 125 раз.
public void sortByMod(int[] millionInts, int divideBy) {
long time = System.nanoTime();
int[] b = new int[millionInts.length];
int remainder, remainderMin = 0, remainderMax = divideBy, positionMin = 0, positionMax = millionInts.length - 1;
for (int i = 0; i < millionInts.length;) {
for (int j = 0; j < millionInts.length; j++) {
remainder = millionInts[j] % divideBy;
if (remainder == remainderMin) {
b[positionMin] = millionInts[j];
positionMin++;
i++;
} else if (remainder == remainderMax) {
b[positionMax] = millionInts[j];
positionMax--;
i++;
}
}
remainderMax--;
remainderMin++;
}
System.out.println("time = " + (System.nanoTime() - time));
System.out.println("loopcount = " + remainderMin);
}
Я написал другой метод, который может сделать это в 2 циклах, но смущает его читать.
Он нарушает ограничение памяти, но очень быстро.
public void sortByModPro(int[] millionInts, int divideBy) {
int[] range = new int[divideBy];
int[] remainders = new int[millionInts.length];
int[] newArray = new int[millionInts.length];
long times = System.nanoTime();
for (int i = 0; i < millionInts.length; i++) {
remainders[i] = millionInts[i] % divideBy;
range[millionInts[i] % divideBy]++;
}
for (int i = range.length - 1, past = millionInts.length; i >= 0; i--) {
range[i] = past - range[i];
past = range[i];
}
for (int i = 0; i < millionInts.length; i++) {
newArray[range[remainders[i]]] = millionInts[i];
range[remainders[i]]++;
}
System.out.println("time = " + (System.nanoTime() - times));
}
Как вы это сделаете с помощью 1 петли?
Массив в Java не может содержать миллион целых чисел. Разве интервьюер не знал об этом? – CKing
Google для быстрой сортировки и реализации с небольшим изменением: вместо сравнения целых чисел в массиве напрямую сравните их остаток. –
@ChetanKinger Конечно, это возможно. Почему он не мог? –