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
        }
    }
    
  • 相关阅读:
    SQL 07: 外连接 (左连接和右连接查询)
    010 利用多线程使socket服务端可以与多个客户端同时通讯
    056 文件修改的两种方式
    009 模拟一个简单抢票小程序代码
    055 文件的高级应用
    054 with管理文件操作上下文
    008 通过开启子进程的方式实现套接字服务端可以并发的处理多个链接以及通讯循环(用到了subprocess模块,解决粘包问题)
    053 文件的三种打开模式
    052 绝对路径和相对路径
    051 基本的文件操作
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13615898.html
Copyright © 2011-2022 走看看