[leetcode]15 Compare Version Numbers

来源:互联网 发布:linux搜狗的手写输入 编辑:程序博客网 时间:2024/06/09 22:55

题目链接: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个字符

0 0
原创粉丝点击