• 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
        }
    }
    
  • 相关阅读:
    Java实现“睡排序”——线程池Executors的使用
    浅谈HashMap与线程安全 (JDK1.8)
    Ubuntu 16 Java Develop环境快速搭建
    Spring Boot在反序列化过程中:jackson.databind.exc.InvalidDefinitionException cannot deserialize from Object value
    Java 8 – Map排序
    vue指令优化网络图片加载速度
    如何实现小于12px的字体效果
    两种以上方式实现已知或者未知宽度的垂直水平居中
    C# winform窗体间传值(使用委托或事件)
    C#栈Stack的使用
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13615898.html
Copyright © 2020-2023  润新知