Разбор задачи: Сжатие диапазонов

Предложенный нами код решения:

def summary_ranges(nums):
    """
    Определяет диапазоны в отсортированном массиве чисел и возвращает их в виде строк.
    
    :param nums: List[int], отсортированный массив уникальных целых чисел.
    :return: List[str], список строковых диапазонов.
    """
    if not nums:
        return []
    
    ranges = []
    start = nums[0]  # Начало текущего диапазона
    
    for i in range(1, len(nums)):
        # Если текущий элемент не является последовательным
        if nums[i] != nums[i - 1] + 1:
            # Добавляем диапазон в результат
            if start == nums[i - 1]:
                ranges.append(f"{start}")
            else:
                ranges.append(f"{start}->{nums[i - 1]}")
            start = nums[i]  # Обновляем начало нового диапазона
    
    # Добавляем последний диапазон
    if start == nums[-1]:
        ranges.append(f"{start}")
    else:
        ranges.append(f"{start}->{nums[-1]}")
    
    return ranges

1. Проверка на пустой массив

if not nums:
    return []

Первый шаг проверяет, является ли массив nums пустым. Если массив пустой, возвращается пустой список, так как в этом случае диапазонов нет.


2. Инициализация переменных

ranges = []
start = nums[0]  # Начало текущего диапазона
  • ranges — список, в который будут добавляться диапазоны в виде строк.
  • start — начало текущего диапазона. Изначально равно первому элементу массива.

3. Итерация по массиву

for i in range(1, len(nums)):
    # Если текущий элемент не является последовательным
    if nums[i] != nums[i - 1] + 1:
        # Добавляем диапазон в результат
        if start == nums[i - 1]:
            ranges.append(f"{start}")
        else:
            ranges.append(f"{start}->{nums[i - 1]}")
        start = nums[i]  # Обновляем начало нового диапазона

Цикл проходит по массиву начиная со второго элемента (индекс 1).

Проверка последовательности чисел:

  • Если текущий элемент nums[i] не является последовательным (не равен предыдущему числу nums[i-1] + 1):
    • Формируется строка диапазона для чисел от start до nums[i-1].
      • Если диапазон состоит из одного числа (start == nums[i-1]), в список добавляется строка с одним числом.
      • Если диапазон состоит из нескольких чисел (start != nums[i-1]), формируется строка в формате "a->b".
    • Обновляется начало нового диапазона (start = nums[i]).

4. Добавление последнего диапазона

if start == nums[-1]:
    ranges.append(f"{start}")
else:
    ranges.append(f"{start}->{nums[-1]}")

После завершения цикла последний диапазон еще не добавлен в список. Этот код выполняет:

  • Если последний диапазон состоит из одного числа (start == nums[-1]), добавляется это число.
  • Если диапазон содержит несколько чисел, добавляется строка в формате "a->b".

5. Возврат результата

return ranges

Функция возвращает список ranges, содержащий строки с диапазонами чисел.


Пример работы

Входные данные:

nums = [0, 1, 2, 4, 5, 7]

Ход выполнения:

  1. start = 0.
  2. Проход по массиву:
    • nums[1] = 1: последовательность продолжается.
    • nums[2] = 2: последовательность продолжается.
    • nums[3] = 4: последовательность прерывается. Добавляется "0->2", start = 4.
    • nums[4] = 5: последовательность продолжается.
    • nums[5] = 7: последовательность прерывается. Добавляется "4->5", start = 7.
  3. Добавляется последний диапазон "7".

Итоговый результат:

["0->2", "4->5", "7"]

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии