注意几个细节:比较大小时可以使用字符串比较,也可以转换成int类型比较,

(1)把string转换成int要注意 当字符串表示的数字超出int范围的情况,不然会报错; (2)用string比较时,要注意字符长度不同的情况,因为直接string比较,“226”是小于“36”的,但在这里的版本比较,“226”是要大于“36”的,所以判断语句就变成了: 既要比较长度也有比较大小,即

v1[i].length() > v2[j].length() 
// 和
(v1[i].length() == v2[j].length() && v1[i] > v2[j])

思路一:

// 字符串比较,能通过所有实例
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串 
     * @param version2 string字符串 
     * @return int整型
     */
    int compare(string version1, string version2) {
        // write code here
        vector<string> v1 = split(version1, '.');
        vector<string> v2 = split(version2, '.');
        
        int i=0, j=0;
        while(i < v1.size() && j < v2.size()){
            if(v1[i].length() > v2[j].length() || (v1[i].length() == v2[j].length() && v1[i] > v2[j])){
                return 1;
            }
            else if(v1[i].length() < v2[j].length() || (v1[i].length() == v2[j].length() && v1[i] < v2[j])) {
                return -1;
            }
            i++;
            j++;
        }
        
        while(i< v1.size()){
            if(v1[i] > "0"){
                return 1;
            }
            i++;
        }
        
        while(j < v2.size()){
            if(v2[j] > "0"){
                return -1;
            }
            j++;
        }
        
        return 0;
    }
    
    vector<string> split(string str, char pat){
        int left=0, right=0;
        vector<string> res;
        while(right < str.length()){
            while(right<str.length() && str[right] != pat){
                right++;
            }
            if(right-left>1 && str[left] == '0'){
                while(left<right-1 && str[left] == '0'){
                    left++;
                }
            }
            string temp = str.substr(left, right-left);
            res.push_back(temp);
            left = right+1;
            right++;
        }
        return res;
    }
    
};

思路二:

// int型比较,不能通过所有实例
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串
     * @param version2 string字符串
     * @return int整型
     */
     int compare(string version1, string version2) {
        // write code here
        vector<int> v1 = split(version1, '.');
        vector<int> v2 = split(version2, '.');
        
        int i=0, j=0;
        while(i < v1.size() && j < v2.size()){
            if(v1[i] > v2[j]){
                return 1;
            }
            else if(v1[i] < v2[j]){
                return -1;
            }
            i++;
            j++;
        }
        
        while(i< v1.size()){
            if(v1[i] > 0){
                return 1;
            }
            i++;
        }
        
        while(j < v2.size()){
            if(v2[j] > 0){
                return -1;
            }
            j++;
        }
        
        return 0;
    }
    
    vector<int> split(string str, char pat){
        int left=0, right=0;
        vector<int> res;
        while(right < str.length()){
            while(right<str.length() && str[right] != pat){
                right++;
            }
            if(right-left>1 && str[left] == '0'){
                while(left<right-1 && str[left] == '0'){
                    left++;
                }
            }
            string temp = str.substr(left, right-left);
            res.push_back(atoi(temp.c_str()));
            left = right+1;
            right++;
        }
        return res;
    }
    
};