83. Свернуть последовательные числа в диапазоны
Условие задачи:
Дан массив целых чисел без повторяющихся элементов.
Необходимо отсортировать числа и преобразовать массив в строку, объединяя соседние по числовому ряду значения в диапазоны.
Примеры:
[1,4,5,2,3,9,8,11,0,13] → "0-5,8-9,11,13"
[3,1,5] → "1,3,5"
[1,3,5] → "1,3,5"
[] → ""
[7] → "7"
Код:
public class Template2 {
public static String compress(int[] array) {
// Реализовать
return "";
}
}
Спойлеры к решению
Подсказки
💡 Сначала отсортируй массив.
💡 Храни начало текущего диапазона и последний просмотренный элемент.
💡 Если следующее число не является соседним, текущий диапазон нужно добавить в результат.
💡 Если начало и конец диапазона совпадают, выводи только одно число.
💡 Храни начало текущего диапазона и последний просмотренный элемент.
💡 Если следующее число не является соседним, текущий диапазон нужно добавить в результат.
💡 Если начало и конец диапазона совпадают, выводи только одно число.
Решение
import java.util.Arrays;
public class Template2 {
public static String compress(int[] array) {
if (array == null || array.length == 0) {
return "";
}
Arrays.sort(array);
StringBuilder result = new StringBuilder();
int start = array[0];
int end = array[0];
for (int i = 1; i < array.length; i++) {
if ((long) array[i] == (long) end + 1) {
end = array[i];
} else {
appendRange(result, start, end);
start = array[i];
end = array[i];
}
}
appendRange(result, start, end);
return result.toString();
}
private static void appendRange(
StringBuilder result,
int start,
int end
) {
if (result.length() > 0) {
result.append(",");
}
if (start == end) {
result.append(start);
} else {
result.append(start)
.append("-")
.append(end);
}
}
}
После сортировки:
[1,4,5,2,3,9,8,11,0,13]
→
[0,1,2,3,4,5,8,9,11,13]
Последовательные значения объединяются:
0,1,2,3,4,5 → 0-5
8,9 → 8-9
11 → 11
13 → 13
Результат:
0-5,8-9,11,13
Сортировка занимает O(n log n), последующий проход — O(n).