首页 > 代码库 > 【Leetcode】:Compare Version Numbers

【Leetcode】:Compare Version Numbers

题目地址:https://oj.leetcode.com/problems/compare-version-numbers/


题目描述:

Compare two version numbers version1 and version1.
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

看到这道题目的AC率那么低也就尝试着做一做。

算法思路:1.首先考虑将两个字符串version1和version2进行切分,因为可能会出现这样的测试用例"1.0.1",有多个点。

2.将按照"."分割之后的数字放到一个容器vector里面或者一个数组里面就行了。

3.然后依次进行比较。有一点需要注意的是,有类似的用例"1.0.0"和"1"其实是相等的,因此,要将容器或者数组中的后缀0去掉,那么比较的时候就没有什么顾虑了。

AC和测试代码:

#include<iostream>
#include<string>
#include<vector>

using namespace std;

class Solution {
private:
        vector<int> v1,v2;
public:
    //split the string by '.' 
    void split_string(const char *str , vector<int> &v)   
    {
        char *buf = new char[ strlen(str) + 1 ];
        strcpy(buf,str);
        char *p = strtok(buf,".");
        while( p!=NULL )
        {
            v.push_back( atoi(p) ) ;
            p = strtok(NULL,".");
        }
    }
    
    //compare two version
    int compareVersion(string version1, string version2) 
    {
        const char *str1 = version1.c_str();
        const char *str2 = version2.c_str();
        
        split_string(str1,v1);
        split_string(str2,v2);
        
        return judge();
    }
    
    int judge()
    {
        //prune the suffix zero : 1.0 == 1
        while( v1.size()!=0 && v1[v1.size()-1]==0 )
        {
            v1.pop_back();       
        }
         while( v2.size()!=0 && v2[v2.size()-1]==0 )
        {
            v2.pop_back();       
        }
        
        int size = min( v1.size(),v2.size() );
        int i;
        for(i=0;i<size;i++)
        {
            if( v1[i]>v2[i] )   return 1;
            else if( v1[i]<v2[i] ) return -1;
            else continue;
        }
        
        if( v1.size() > v2.size() )     
        { 
              return 1;  
        }
        else if( v1.size() < v2.size() ) return -1;
        else return 0;
        
    }
};

int main()
{
    Solution s ;
    cout<<s.compareVersion("1.0","1")<<endl;
    
    system("pause");
    return 0;
}

还是根据测试用例进行修改代码,因此考虑到比较完整的测试用例很重要。






【Leetcode】:Compare Version Numbers