比较版本号--split方法的运用 和 双指针的运用

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比较版本号--split方法的运用 和 双指针的运用相关的知识,希望对你有一定的参考价值。


题目


oj平台

方法一:split方法的运用

欺负我C++没有split方法是吧,那就只能自己写了相应的功能实现了。。

C++代码

class Solution {
public:
    int compareVersion(string version1, string version2) {
        vector<int>v1,v2;
        //预处理,把字符串根据'.'分割,然后单独得出int结果存入空间
        preHandle(version1,v1);preHandle(version2,v2);
        int len1 = v1.size(),len2 = v2.size();
        int lenMax = len1>len2?len1:len2;
        int sum1=0,sum2 = 0;
        //直接加和比较结果
        for(int i=0;i<lenMax;i++){
            if(i<len1)
                sum1+=v1[i];
            if(i<len2)
                sum2+=v2[i];
            if(sum1>sum2)
                return 1;
            if(sum1<sum2)
                return -1;
        }
        return 0;
    }
private: 
    //预处理函数
    void preHandle(string& s,vector<int>&res){
        string temp = "";
        for(int i=0;i<s.size();i++){
            if(isdigit(s[i])){
                temp += s[i];
            }else if(s[i]=='.'){
                res.emplace_back(atoi(temp.c_str()));
                temp = "";
            }
        }
        res.emplace_back(atoi(temp.c_str()));
    }
};

Go语言代码

关于strconv.Atoi()函数的返回值:func Atoi(s string) (int, error),很明显有两个返回值,其中的erro接口的值如果是nil则表示,转换成功,否则失败。

func compareVersion(version1, version2 string) int {
    v1 := strings.Split(version1, ".")
    v2 := strings.Split(version2, ".")
    for i := 0; i < len(v1) || i < len(v2); i++ {
        x, y := 0, 0
        if i < len(v1) {
            x, _ = strconv.Atoi(v1[i])
        }
        if i < len(v2) {
            y, _ = strconv.Atoi(v2[i])
        }
        if x > y {
            return 1
        }
        if x < y {
            return -1
        }
    }
    return 0
}

方法二:双指针的运用

C++代码

如果想要更原生,则可以不用string,转整数可以自己完成

class Solution {
public:
    int compareVersion(string version1, string version2) {
        int i=0,j=0;
        while(i<version1.size()||j<version2.size())
        {
            string temp1 = "0",temp2="0";
            while(i<version1.size()&&isdigit(version1[i]))
            {
                temp1+=version1[i];
                i++;
            }
            while(j<version2.size()&&isdigit(version2[j]))
            {
                temp2+=version2[j];
                j++;
            }
            if(stoi(temp1)>stoi(temp2))
                return 1;
            if(stoi(temp1)<stoi(temp2))
                return -1;
            i++;
            j++;
        }
        return 0;
    }
};

Go语言代码

func compareVersion(version1, version2 string) int {
    n, m := len(version1), len(version2)
    i, j := 0, 0
    for i < n || j < m {
        x := 0
        for ; i < n && version1[i] != '.'; i++ {
            x = x*10 + int(version1[i]-'0')
        }
        i++ // 跳过点号
        y := 0
        for ; j < m && version2[j] != '.'; j++ {
            y = y*10 + int(version2[j]-'0')
        }
        j++ // 跳过点号
        if x > y {
            return 1
        }
        if x < y {
            return -1
        }
    }
    return 0
}

以上是关于比较版本号--split方法的运用 和 双指针的运用的主要内容,如果未能解决你的问题,请参考以下文章

[M模拟] lc165. 比较版本号(字符串分割+split函数+水题)

Leetcode刷题100天—165. 比较版本号( 双指针)—day25

Leetcode刷题100天—165. 比较版本号( 双指针)—day25

LeetCode 165 比较版本号[双指针] HERODING的LeetCode之路

前端js进行APP版本号比较方法

leetcode中等165比较版本号