首页 > 其他分享 >LeetCode题练习与总结:比较版本号--165

LeetCode题练习与总结:比较版本号--165

时间:2024-07-19 23:25:18浏览次数:17  
标签:version1 version2 版本号 复杂度 -- 数组 165 修订

一、题目描述

给你两个 版本号字符串 version1 和 version2 ,请你比较它们。版本号由被点 '.' 分开的修订号组成。修订号的值 是它 转换为整数 并忽略前导零。

比较版本号时,请按 从左到右的顺序 依次比较它们的修订号。如果其中一个版本字符串的修订号较少,则将缺失的修订号视为 0

返回规则如下:

  • 如果 version1 version2 返回 -1
  • 如果 version1 version2 返回 1
  • 除此之外返回 0

示例 1:

输入:version1 = "1.2", version2 = "1.10"

输出:-1

解释:

version1 的第二个修订号为 "2",version2 的第二个修订号为 "10":2 < 10,所以 version1 < version2。

示例 2:

输入:version1 = "1.01", version2 = "1.001"

输出:0

解释:

忽略前导零,"01" 和 "001" 都代表相同的整数 "1"。

示例 3:

输入:version1 = "1.0", version2 = "1.0.0.0"

输出:0

解释:

version1 有更少的修订号,每个缺失的修订号按 "0" 处理。

提示:

  • 1 <= version1.length, version2.length <= 500
  • version1 和 version2 仅包含数字和 '.'
  • version1 和 version2 都是 有效版本号
  • version1 和 version2 的所有修订号都可以存储在 32 位整数 中

二、解题思路

1. 将两个版本号字符串按照点号 ‘.’ 分割成修订号数组。

2. 比较两个数组对应位置的修订号:

  • 转换修订号为整数时,忽略前导零。
  • 如果某个版本号的数组较短,将缺失的修订号视为 0。

3. 按从左到右的顺序比较修订号:

  • 如果当前修订号 version1 < version2,返回 -1。
  • 如果当前修订号 version1 > version2,返回 1。
  • 如果所有修订号都相等,返回 0。

三、具体代码

class Solution {
    public int compareVersion(String version1, String version2) {
        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");
        
        for (int i = 0; i < Math.max(v1.length, v2.length); i++) {
            int num1 = i < v1.length ? Integer.parseInt(v1[i]) : 0;
            int num2 = i < v2.length ? Integer.parseInt(v2[i]) : 0;
            
            if (num1 < num2) {
                return -1;
            } else if (num1 > num2) {
                return 1;
            }
        }
        
        return 0;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • split("\\.") 方法将每个版本号字符串分割成数组,这个操作的时间复杂度是 O(n + m),其中 n 是 version1 的长度,m 是 version2 的长度。因为每个字符都会被扫描一次来确定 ‘.’ 的位置。
  • Math.max(v1.length, v2.length) 的时间复杂度是 O(1),因为这是常数时间操作。
  • 循环中的操作(包括 Integer.parseInt 和比较操作)会执行 Math.max(v1.length, v2.length) 次,因此这部分的时间复杂度是 O(max(n, m))。

综上所述,总的时间复杂度是 O(n + m),其中 n 是 version1 的长度,m 是 version2 的长度。

2. 空间复杂度
  • split("\\.") 方法为每个版本号创建一个新的数组,每个数组的大小取决于 ‘.’ 的数量。在最坏的情况下,每个版本号可能只有一个数字,没有 ‘.’,这将导致数组大小与版本号长度相同。因此,空间复杂度是 O(n + m),其中 n 是 version1 的长度,m 是 version2 的长度。

综上所述,总的空间复杂度是 O(n + m),其中 n 是 version1 的长度,m 是 version2 的长度。

注意:这里的 n 和 m 是指版本号字符串的长度,而不是分割后数组的大小。在实际应用中,版本号通常不会非常长,因此这些操作的时间复杂度和空间复杂度都是可以接受的。

五、总结知识点

  1. 字符串分割:使用 split("\\.") 方法将版本号字符串按照点号 ‘.’ 分割成数组。这里的 \\ 是因为 ‘.’ 在正则表达式中是一个特殊字符,表示任意字符,所以需要使用反斜杠进行转义。

  2. 数组操作:通过循环和数组索引来访问数组的元素。在本代码中,使用了 split 方法生成的数组,并通过索引 i 来获取对应的修订号。

  3. 整数转换:使用 Integer.parseInt 方法将字符串转换为整数。这个方法会忽略字符串前导的零。

  4. 条件语句:使用了三元操作符 ?: 来进行条件判断,简化了代码。如果条件为真,返回冒号前的值,否则返回冒号后的值。

  5. 循环控制:使用 for 循环来遍历数组,直到达到两个数组中较长者的长度。

  6. 数学运算:使用 Math.max 方法来获取两个长度的最大值,以确定循环的次数。

  7. 返回值:根据比较结果返回整数 -10 或 1,这符合题目要求的返回规则。

  8. 函数定义:整个代码定义了一个名为 compareVersion 的公共方法,这是解决问题的关键部分,它接受两个字符串参数并返回一个整数值。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

标签:version1,version2,版本号,复杂度,--,数组,165,修订
From: https://blog.csdn.net/weixin_62860386/article/details/140255072

相关文章

  • [C++初阶]deque的讲解
    1.deque介绍          Deque是双端队列的不规则缩写。双端队列是具有动态大小的序列容器,可以在两端扩展或收缩。特定的库可能以不同的方式实现deque,通常是某种形式的动态数组。在任何情况下,它们都允许通过随机访问迭代器直接访问单个元素,并根据需要通过扩展和收缩......
  • codeforce959
    CodeforcesRound959sponsoredbyNEAR(Div.1+Div.2)A.DiverseGametimelimitpertest:1secondmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputPetr,watchingSergey'sstream,cameupwithamatrix\(a\),c......
  • Mac终端美化(iterm2+oh-my-zsh+vim)
    vim+oh-my-zsh+git配置开发环境vim配置安装vundle使用vundle作为插件管理器,使用前先安装vundlemkdir-p~/.vim/bundlegitclonehttps://github.com/gmarik/Vundle.vim.git~/.vim/bundle/Vundle.vim 配置.vimrc编辑~/.vimrc文件,写入以下内容setnocompatible......
  • 【C#开发】C#的协变和逆变
    当时第一次学到协变和逆变的时候印象不是很深,不是很能理解。结果很快想起在刷leetcode题的时候遇到关于这个问题的情况。问题的出现就比如力扣第15题三数之和他的返回值是IList<IList<int>>代表意思类似二维数组。我第一反应就是先声明一个List<List<int>>res的变......
  • [ARC173E] Rearrange and Adjacent XOR 题解
    题目链接点击打开链接题目解法太牛了!!!这道题我的第一反应是从高位往低位确定,但这样就全错了换个角度考虑,找最后的答案可以由那些数异或而成这里给出结论:答案一定是偶数个数的异或和(在\(n\%4=2\)且\(n\neq2\)时,不能由全集构成)证明:选出的数非全集的情况用数学归纳法......
  • 数据仓库建模工具之一——Hive学习第五天
    Hive的分区1、Hive分区(十分重要!!)分区的目的:避免全表扫描,加快查询速度!在大数据中,最常见的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个个小的文件就会很容易了,同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据,按照每天或者......
  • 设置ssh登陆终端的欢迎信息(linux登录配置,/etc/motd有趣的图案【佛祖保佑】)
    设置ssh终端登陆后的欢迎信息是个很实用的技巧,可以给登陆机器的用户发布一些公告信息,或者做一些有趣的字符图案展示。在这里分享我所知道的两种方法:1.系统级别的提示(即系统的所有用户登陆后都能看到)这个很简单,以root用户身份修改/etc/motd这个文件,将想要展示的文字写入此文件,......
  • 集群及分布式定时任务中间件MEE_TIMED
    集群及分布式定时任务中间件MEE_TIMED转载请著名出处:https://www.cnblogs.com/funnyzpc/p/18312521MEE_TIMED一套开源的定时任务中间件,MEE_TIMED简化了scheduled及shedlock的配置,同时也升级了这两种中间件的能力,使定时任务开发更具灵活性的同时具备集群及分布式节点的管理......
  • 计算机的错误计算(三十四)
    摘要 用错数预测 (或 pow(a,x))函数的结果中含有的错误数字的个数,并与VisualStudio和Excel的输出中含有的错误位数相比较。结果显示,预测与实际一致。    对于 (或 pow(a,x))函数,根据 与 的不同,有多种计算算法。其中一种计算方法是利用等价公式  来计算。例1.......
  • 图像处理任务
    1.图像级分类特征抽取:卷积神经网络:卷积:图像的channel不断的增大卷积批规范化激活函数池化:图像size(H,W)减小网络比较浅的时候,直接堆叠 卷积+池化即可网络比较深的时候,考虑 ResBlock 结构分类输出:有多少类别就有多少个输出神经元全连接来做输出......