题解 | #比较版本号#
比较版本号
https://www.nowcoder.com/practice/2b317e02f14247a49ffdbdba315459e7
#include <iostream> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 方法一:该方法的时间复杂度为O(n), 没有使用二分查找法; 要点:利用迭代器进行相互比较,抽象出接口,可以让代码更加简洁,而且不容易出错。 * 比较版本号 * @param version1 string字符串 * @param version2 string字符串 * @return int整型 */ int compare(string version1, string version2) { auto number1 = GetRevisionNumbers(version1); auto number2 = GetRevisionNumbers(version2); /* 版本一:该比较累赘,容易出错;版本二,利用了vector的resize的用法;简洁不容易出错; auto n1 = number1.size(); auto n2 = number2.size(); if (n1 > n2) { for (auto i = 0; i < n1 - n2; ++i) number2.push_back(0); } else if (n1 < n2) { for (auto i = 0; i < n2 - n1; ++i) number1.push_back(0); } */ // 版本二: auto number1 = GetRevisionNumbers(version1); auto number2 = GetRevisionNumbers(version2); auto max_count = std::max(number1.size(), number2.size()); number1.resize(max_count); number2.resize(max_count); auto it1 = number1.cbegin(), it2 = number2.cbegin(); while (it1 != number1.cend() && it2 != number2.cend()) { if (*it1 > *it2) return 1; else if (*it1 < *it2) return -1; else { ++it1; ++it2; } } return 0; } std::vector<int32_t> GetRevisionNumbers(string& version) { std::vector<int32_t> revisions; const char kDelimeter = '.'; auto it = version.cbegin(); int32_t num = 0; auto count = 0; bool first_is_zero = true; while (it != version.cend()) { if (*it != '.') { if (first_is_zero) { if (*it == '0') { ++it; continue; } else { first_is_zero = false; } } num += (*it - '0') * pow(10, count); ++count; } else { revisions.push_back(num); num = 0; count = 0; first_is_zero = true; } ++it; } revisions.push_back(num); return revisions; } };