zoukankan      html  css  js  c++  java
  • 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
        }
    }
    
  • 相关阅读:
    处在什么都想学,却又不知道怎么学的处境
    启动MongoDB shell客户端会什么会一闪而过
    Socket.io发送消息含义
    轮询、长轮询与Web Socket的前端实现
    org.apache.commons.lang3.StringUtils类中isBlank和isEmpty方法的区别
    JS学习笔记10_Ajax
    JS学习笔记9_JSON
    JS学习笔记8_错误处理
    JS学习笔记7_表单脚本
    JS学习笔记6_事件
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13615898.html
Copyright © 2011-2022 走看看