[leetcode]15 Compare Version Numbers

题目链接:https://oj.leetcode.com/problems/compare-version-numbers/
Runtimes:2ms

1、问题

ompare two version numbers version1 and version2.
If version1 > version2 return 1, if version1 < version2 return -1, otherwise return 0.
You may assume that the version strings are non-empty and contain only digits and the . character.
The . character does not represent a decimal point and is used to separate number sequences.
For instance, 2.5 is not “two and a half” or “half way to version three”, it is the fifth second-level revision of the second first-level revision.
Here is an example of version numbers ordering:

0.1 < 1.1 < 1.2 < 13.37

2、分析

本题目是版本比较大小一开始以为只有一个小数点,所以转换成小数进行比较,但是没想版本号也可以是1.200.03.0004,于是重新审视版本号。其一,不止一个点;其二,版本每个局部数字开头可以是0;其三,两个版本号的长度参差不齐。

3、小结

举个栗子:A(1.200.03.4) 与 B(0001.200.3) 比较版本号

从以上分析可以有对应的解题思路,首先比较对应的两个局部版本号可以看出,前3个局部版本号都一样(解题中我们将每个局部版本号转换成为整数再比较);此时需要继续判断A的第四个局部版本号,发现大于零,于是可以得出A的版本号大。假如A的第四个局部版本号等于零,那么可以得出两个版本号一样大。

4、实现

class Solution {
public:
    int changeToInt(string s)
    {
        int a = 0;
        for(int i = 0; i < s.size(); i++)
        {
            a = a * 10 + (s[i] - 48);
        }
        return a;
    }

    int compareVersion(string version1, string version2) {
        int j = 0; int s1 = 0, s2 = 0;
        for (int i = 0;; i++)
        {
            if (i == version1.size() || version1[i] == '.')
            {
                while (j < version2.size() && version2[j] != '.')
                    j++;
                int a = changeToInt(version1.substr(s1, i - s1));
                int b = changeToInt(version2.substr(s2, j - s2));
                if (a > b)
                    return 1;
                else if (a < b)
                    return -1;
                s1 = i + 1; s2 = j + 1;
                j++;
            }
            if (i >= version1.size())
            {
                if (j >= version2.size())
                    break;
                while (j < version2.size() && version2[j] != '.')
                    j++;
                if (changeToInt(version2.substr(s2, j - s2)) > 0)
                    return -1;
                break;
            }
            if (j >= version2.size())
            {
                i++;
                if (i >= version1.size())
                    break;
                while (i < version1.size() && version1[i] != '.')
                    i++;
                if (changeToInt(version1.substr(s1, i - s1)) > 0)
                    return 1;
                break;
            }
        }
        return 0;
    }
};

5、反思

考虑问题不是很周全,首先是对版本号认识不准确,其次是没有考虑对比最后一部分,因为之前以’.’为判断条件,接着也没有考虑到长短不一的情况。编程序能力有待提高。对了,这次又用到了string库函数.

string substr(int pos = 0, int n = npos) const; //返回以pos开始的连续n个字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值