leetcode刷题笔记一百六十五题 比较版本号

leetcode刷题笔记一百六十五题 比较版本号

源地址:165. 比较版本号

问题描述:

较两个版本号 version1 和 version2。
如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0。

你可以假设版本字符串非空,并且只包含数字和 . 字符。

. 字符不代表小数点,而是用于分隔数字序列。

例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。

你可以假设版本号的每一级的默认修订版号为 0。例如,版本号 3.4 的第一级(大版本)和第二级(小版本)修订号分别为 3 和 4。其第三级和第四级修订号均为 0。

示例 1:

输入: version1 = "0.1", version2 = "1.1"
输出: -1
示例 2:

输入: version1 = "1.0.1", version2 = "1"
输出: 1
示例 3:

输入: version1 = "7.5.2.4", version2 = "7.5.3"
输出: -1
示例 4:

输入:version1 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,“01” 和 “001” 表示相同的数字 “1”。
示例 5:

输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 没有第三级修订号,这意味着它的第三级修订号默认为 “0”。

提示:

版本字符串由以点 (.) 分隔的数字字符串组成。这个数字字符串可能有前导零。
版本字符串不以点开始或结束,并且其中不会有两个连续的点。

//常见思路 使用封装API对字符串进行split 比较每层的版本号是否一致
object Solution {
    def compareVersion(version1: String, version2: String): Int = {
        val arrStr1 = version1.split('.')
        val arrStr2 = version2.split('.')
        val lenStr1 = arrStr1.length
        val lenStr2 = arrStr2.length 
        
        //边界条件处理
        if (lenStr1 == 1 && lenStr2 == 0) return 1
        if (lenStr1 == 0 && lenStr2 == 1) return -1

        
        for (i <- 0 to Math.max(lenStr1, lenStr2)-1){
            val str1 = {
                if (i < lenStr1) arrStr1(i).toInt
                else 0
            }
            val str2 = {
                if (i < lenStr2) arrStr2(i).toInt
                else 0
            }
            if (str1 > str2) return 1
            if (str1 < str2) return -1
            
        }
        return 0
    }
}

//双指针法 计算每层的版本号进行比较
//对于'.'跳过, 对层内数字进行求和比较
object Solution {
    def compareVersion(version1: String, version2: String): Int = {
        val ver1Len = version1.length
        val ver2Len = version2.length
        var ver1Cur = 0
        var ver2Cur = 0

        while (ver1Cur < ver1Len || ver2Cur < ver2Len) {
            if (ver1Cur < ver1Len && version1.charAt(ver1Cur) == '.') ver1Cur += 1
            if (ver2Cur < ver2Len && version2.charAt(ver2Cur) == '.') ver2Cur += 1
            var acc1 = 0
            var acc2 = 0
            while (ver1Cur < ver1Len && version1.charAt(ver1Cur)!= '.') {
                acc1 +=  acc1 * 10 + version1.charAt(ver1Cur) - '0'
                ver1Cur += 1
            }
            while (ver2Cur < ver2Len && version2.charAt(ver2Cur)!= '.') {
                acc2 +=  acc2 * 10 + version2.charAt(ver2Cur) - '0'
                ver2Cur += 1
            }
            if (acc1 < acc2) return -1
            if (acc1 > acc2) return 1
        }
        return 0
    }
}
原文地址:https://www.cnblogs.com/ganshuoos/p/13615898.html