字节/蚂蚁/美团/拼多多 LeetCode 165.比较版本号

思路:

1.把字符串按照 . 分割并存储到字符串数组,每次按顺序从两个字符串数组中取出1个元素并转成整数,依次比较。

2.查看下面的示例:发现示例1的列表为1,2和1,10,示例2的列表均为1,1,示例3的列表均为1,0,0,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" 处理。

3.问题可以转化为比较这两个列表的字典序:

(1)从左到右遍历两个列表(分别记作a和b);

(2)如果ai < bi,返回-1;

(3)如果ai > bi,返回1;

(4)否则继续向后遍历;

(5)如果遍历过程中没有返回,说明两个列表相同,返回0。

4.复杂度分析:

(1)时间复杂度:O(n + m),其中n是version1的长度,m是version2的长度。

(2)空间复杂度:O(n + m)。

附代码:

java 复制代码
class Solution {
    public int compareVersion(String version1, String version2) {
        // string.split("\\.")是Java中用正则表达式分割字符串的方法
        // 在正则表达式中,\.表示普通的点字符
        // 但由于在Java字符串中,\本身需要转义,所以要写成\\.
        // 所以本质的含义就是按照点号字符分割字符串,只是因为点号在正则表达式中有特殊的含义,所以需要转义
        String[] a = version1.split("\\."); // 字符串数组a存储按点分割的version1
        String[] b = version2.split("\\."); // 字符串数组b存储按点分割的version2
        int n = a.length; // version1有多少段
        int m = b.length; // version2有多少段
        for (int i = 0; i < n || i < m; i++) {
            int ver1 = i < n ? Integer.parseInt(a[i]) : 0;
            int ver2 = i < m ? Integer.parseInt(b[i]) : 0;
            if (ver1 != ver2) {
                return ver1 < ver2 ? -1 : 1;
            }
        }
        return 0;
    }
}

ACM模式:

java 复制代码
import java.util.Scanner;

class Solution {
    public int compareVersion(String version1, String version2) {
        // string.split("\\.")是Java中用正则表达式分割字符串的方法
        // 在正则表达式中,\.表示普通的点字符
        // 但由于在Java字符串中,\本身需要转义,所以要写成\\.
        // 所以本质的含义就是按照点号字符分割字符串,只是因为点号在正则表达式中有特殊的含义,所以需要转义
        String[] a = version1.split("\\.");
        String[] b = version2.split("\\.");
        int n = a.length;
        int m = b.length;
        for (int i = 0; i < n || i < m; i++) {
            int ver1 = i < n ? Integer.parseInt(a[i]) : 0;
            int ver2 = i < m ? Integer.parseInt(b[i]) : 0;
            if (ver1 != ver2) {
                return ver1 < ver2 ? -1 : 1;
            }
        }
        return 0;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取两个版本号字符串
        String version1 = scanner.next();
        String version2 = scanner.next();

        // 比较版本号
        Solution solution = new Solution();
        int result = solution.compareVersion(version1, version2);
        System.out.println(result);

        scanner.close();
    }
}
相关推荐
2601_962106643 小时前
【Java Set综合实战】商品管理系统 + 图书收藏系统|Product、Book自定义类全套代码
java
RuoyiOffice4 小时前
SpringBoot+Vue3 凭证生命周期设计:审核、过账、冲销与反过账怎样保持账目一致
java·spring boot·事务·springboot3·财务系统·会计凭证·ruoyi office
2601_962106644 小时前
HashMap入门|工号-姓名键值存储、两种遍历方式、根据key/value查
java
Pniubi5 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
杨凯凡5 小时前
Spring Framework 7 API 版本管理实战:请求头路由、兼容迁移与废弃策略
java·rest api·springframework·spring boot 4·api版本管理
T_Wizard5 小时前
同一个问题写了 4 遍:官方 SDK / HTTP / Spring AI / LangChain4j,到底该选哪个
java·ai编程
hai_android5 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
斯维赤6 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构
aiks_yuan8 小时前
Java CPU 100% 怎么排查:JDK 11 起 jstack 自带线程 CPU 时间,不用再 top -H 换算十六进制(JDK 8、11、17 实测)
java
Flynn Liang10 小时前
AiServices 源码级拆解:一个接口如何变成 RAG Agent
java·langchain·源码分析·rag·langchain4j·aiservices