Скопируйте и отсортируйте числа, затем объедините последовательности, где соседние значения отличаются на единицу. Одиночные элементы выводятся без дефиса.
// Дан массив неотрицательных чисел без повторяющихся элементов.
Скопируйте и отсортируйте числа, затем объедините последовательности, где соседние значения отличаются на единицу. Одиночные элементы выводятся без дефиса.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
// Дан массив неотрицательных чисел без повторяющихся элементов. // Нужно его преобразовать в строку, сворачивая соседние по числовому ряду числа в диапазоны. // // Пример: [1, 4, 5, 2, 3, 9, 8, 11, 0, 13] -> "0-5,8-9,11,13"
func listToRanges(items []int) string { // TODO: implement this return "" }
Ответ
Скопируйте и отсортируйте числа, затем объедините последовательности, где соседние значения отличаются на единицу. Одиночные элементы выводятся без дефиса.
func listToRanges(items []int) string {
values := append([]int(nil), items...)
sort.Ints(values)
parts := make([]string, 0)
for i := 0; i < len(values); i++ {
start, end := values[i], values[i]
for i+1 < len(values) && values[i+1]-end == 1 {
i++
end = values[i]
}
if start == end {
parts = append(parts, strconv.Itoa(start))
} else {
parts = append(parts, fmt.Sprintf("%d-%d", start, end))
}
}
return strings.Join(parts, ",")
}
Импорты: sort, strconv, fmt, strings. В условии числа неотрицательные и без повторов; исходный массив не изменяется. Пустой ввод даёт пустую строку. Сложность O(n log n) из-за сортировки.