题解 | #比较版本号#
比较版本号
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;
}
};
美的集团公司福利 818人发布