Версия — строка вида v7.9.21 или 7.9.21: необязательная буква v в начале, затем
непустые группы цифр через точку. Сравните две версии покомпонентно, как числа:
3.9.1 < 3.10.0 — 9 меньше 10, хотя строка «9» больше строки «10»;
- недостающие компоненты считаются нулями:
2 == 2.0.0, 7.9.21 < 7.9.21.5;
- ведущие нули не важны:
1.01 == 1.001 == 1.1;
- префикс
v не влияет на значение: v1.2 == 1.2;
- компонент может быть сколь угодно длинным и не помещаться в int64.
// CompareVersions возвращает -1, если v1 < v2; 1, если v1 > v2; 0, если равны.
func CompareVersions(v1, v2 string) int
Примеры
CompareVersions("2.3.5", "2.3.6") // -1
CompareVersions("3.0", "2.0.0") // 1
CompareVersions("2.0.0", "2") // 0
CompareVersions("2", "2.0.5") // -1
CompareVersions("v3.9.1", "v3.10.0") // -1
CompareVersions("v7.9.21", "v7.9.21.0.0") // 0
CompareVersions("1.99999999999999999999", "1.100000000000000000000") // -1
Вход гарантированно корректен. Длина строк до 10^5. Время O(len(v1) + len(v2)).
Устно: два способа решения — через разбиение на слайсы и через два указателя.
Чем они отличаются по памяти?
Разбор и эталонное решение — после своей попытки: на собеседовании подсказок не будет.
Сначала попробуй сам — подсказки не дают готовый ответ.