UniLecs #Task. Compare Versions
Задача: даны два номера версии, необходимо определить какая версия больше.
Входные данные: 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”.
Примеры:
- version1 = “5.05”, version2 = “5.005”
Output: 0 (игнорируем ведущие нули в подверсии, получаем “5.5” == “5.5”) - version1 = “7.0.1”, version2 = “7”
Output: 1 - version1 = “5.1.2.4”, version2 = “5.1.3”
Output: -1
Разбор
Алгоритм заключается в создании 2х указателей и паралелльном прохождении двух строк и последовательном сравнении подверсий.
- k1, k2 — указетели на 1ю и 2ю строку.
- В цикле последовательно извлекаем подверсии каждой из строк и сравниваем.
- После основного цикла, проверяем обе строки на оставшиеся символы. Если встречаем не нулевые символы выводим соот-ий результат.
Для простоты мы заранее извлекли все подверсии в массив с помощью функции Split, но стоит добавить, что этого можно было не делать, а последовательно извлекать подверсии внутри цикла.
Реализация
https://gist.github.com/unilecs/e821e29186d5306ca731bd172322ac4b