UniLecs #Task. Compare Versions

Albert Davletov
UniLecs
Published in
2 min readSep 27, 2020

Задача: даны два номера версии, необходимо определить какая версия больше.

Входные данные: version1, version2 — версии, представленные в виде строк.

Формат строки: номер версии состоит из одной или нескольких “подверсий”, ктр соединены точкой ‘.’
Каждая подверсия состоит из цифр и может содержать ведущие нули. Каждая подверсия содержит хотя бы один символ. Например, “1.6.47” или “0.0.1” — приемлемые номера версий.

Вывод:

  • если version1 > version2 функция возвращает 1;
  • если version1 < version2 функция возвращает -1;
  • если версии одинаковы, то 0.

Правила сравнения:

  • Наибольший порядок версии находится слева, наименьший — справа. То есть сравнивайте версии слева направо;
  • Начальные нули в подверсии игнорируются, т.е. версия “0.001” равна версии “0.1”;
  • Если минимальная подверсия не указана, то рассматривайте ее как 0. Т.е. версия “1.5” меньше чем версия “1.5.1”, т.к. “1.5.0” < “1.5.1”.

Примеры:

  1. version1 = “5.05”, version2 = “5.005”
    Output: 0 (игнорируем ведущие нули в подверсии, получаем “5.5” == “5.5”)
  2. version1 = “7.0.1”, version2 = “7”
    Output: 1
  3. version1 = “5.1.2.4”, version2 = “5.1.3”
    Output: -1

Разбор

Алгоритм заключается в создании 2х указателей и паралелльном прохождении двух строк и последовательном сравнении подверсий.

  1. k1, k2 — указетели на 1ю и 2ю строку.
  2. В цикле последовательно извлекаем подверсии каждой из строк и сравниваем.
  3. После основного цикла, проверяем обе строки на оставшиеся символы. Если встречаем не нулевые символы выводим соот-ий результат.

Для простоты мы заранее извлекли все подверсии в массив с помощью функции Split, но стоит добавить, что этого можно было не делать, а последовательно извлекать подверсии внутри цикла.

Реализация

C#
C#

https://gist.github.com/unilecs/e821e29186d5306ca731bd172322ac4b

Play-test

https://dotnetfiddle.net/7FG3Jb

--

--