美文网首页
Leetcode165. 比较版本号

Leetcode165. 比较版本号

作者: LonnieQ | 来源:发表于2020-01-21 13:32 被阅读0次

题目

比较两个版本号 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

相关文章

网友评论

      本文标题:Leetcode165. 比较版本号

      本文链接:https://www.haomeiwen.com/subject/gkrezctx.html