题目
比较两个版本号 version1 和 version2。
如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0。
你可以假设版本字符串非空,并且只包含数字和 . 字符。
. 字符不代表小数点,而是用于分隔数字序列。
例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。
你可以假设版本号的每一级的默认修订版号为 0。例如,版本号 3.4 的第一级(大版本)和第二级(小版本)修订号分别为 3 和 4。其第三级和第四级修订号均为 0。
示例 1:
输入: version1 = "0.1", version2 = "1.1"
输出: -1
示例 2:
输入: version1 = "1.0.1", version2 = "1"
输出: 1
示例 3:
输入: version1 = "7.5.2.4", version2 = "7.5.3"
输出: -1
示例 4:
输入:version1 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,“01” 和 “001” 表示相同的数字 “1”。
示例 5:
输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 没有第三级修订号,这意味着它的第三级修订号默认为 “0”。
提示:
版本字符串由以点 (.) 分隔的数字字符串组成。这个数字字符串可能有前导零。
版本字符串不以点开始或结束,并且其中不会有两个连续的点。
思路
将版本号字符串version1, version2分割成vector<int>类型 nums1, nums2,然后逐一对比数字。如果nums1、nums2不等长再判断长的数组是否包含非0数字。
C++解法
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> getNumber(string version) {
vector<int> nums;
int num = 0;
for (int i = 0; i < version.size(); ++i) {
if (version[i] != '.') {
num = num * 10 + (version[i] - 48);
}
if (version[i] == '.' || i == version.size() - 1) {
nums.push_back(num);
num = 0;
}
}
return nums;
}
bool containsNoneZero(vector<int> & nums, int from) {
for (int i = from; i < nums.size(); ++i) {
if (nums[i] > 0) return true;
}
return false;
}
int compareVersion(string version1, string version2) {
auto nums1 = getNumber(version1);
auto nums2 = getNumber(version2);
int size = (int)min(nums1.size(), nums2.size()), cmp = 0;
for (int i = 0; i < size; ++i) {
cmp = nums1[i] - nums2[i];
if (cmp > 0) return 1;
if (cmp < 0) return -1;
}
if (nums1.size() > nums2.size()) {
return containsNoneZero(nums1, size) ? 1 : 0;
} else {
return containsNoneZero(nums2, size) ? -1 : 0;
}
}
};
int main(int argc, const char * argv[]) {
vector<pair<string, string>> items = {
{"0.1","1.1"},
{"1.0.1", "1"},
{"7.5.2.4", "7.5.3"},
{"1.01", "1.001"},
};
Solution solution;
for (auto item: items) {
cout << solution.compareVersion(item.first, item.second) << endl;
}
return 0;
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/compare-version-numbers