LeetCode: Compare Version Numbers

Compare 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
class Solution {
public:
    int compareVersion(string version1, string version2) {
        int pos1 = 0, pos2 = 0, pre1 = 0, pre2 = 0;
        while(pos1 < version1.size() && pos2 < version2.size())
        {
            pos1 = version1.find('.', pos1) == std::string::npos ? version1.size() : version1.find('.', pos1);
            pos2 = version2.find('.', pos2) == std::string::npos ? version2.size() : version2.find('.', pos2);
            int cur = compare(version1.substr(pre1, pos1-pre1), version2.substr(pre2, pos2-pre2));
            pos1++;
            pos2++;
            if(cur == 0)
            {
                pre1 = pos1;
                pre2 = pos2;
            }
            else
                return cur;
        }
        while(pos1 < version1.size() && (version1[pos1] == '0' || version1[pos1] == '.'))
        {
            pos1++;
        }
        while(pos2 < version2.size() && (version2[pos2] == '0' || version2[pos2] == '.' ))
        {
            pos2++;
        }
        if(pos1 < version1.size())
            return 1;
        else if(pos2 < version2.size())
            return -1;
        else
            return 0;
    }
private:
    int compare( string v1,  string v2)
    {
		while(!v1.empty() && v1[0] == '0')
        {
            v1 = v1.size() > 1 ? v1.substr(1) : "";
        }
		while(!v2.empty() && v2[0] == '0')
        {
			v2 = v2.size() > 1 ? v2.substr(1) : "";
        }
        int l1 = v1.size();
        int l2 = v2.size();
        if(l1 == l2)
        {
            for(int i = 0; i < l1; i++)
            {
                if(v1[i] == v2[i])
                    continue;
                else
                {
                    return v1[i] - v2[i] > 0 ? 1 : -1;
                }
            }
            return 0;
        }
        else
            return l1 > l2 ? 1 : -1;
        
    }

};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值