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

思路:

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

2.查看下面的示例:发现示例1的列表为1,21,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();
    }
}
相关推荐
唐青枫14 小时前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马15 小时前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户37215742613515 小时前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户37215742613515 小时前
Java 打印 Word 文档:从基础打印到高级设置
java
用户3521802454751 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程
东坡白菜1 天前
破局全栈:一个前端开发的Java入门实战记录(1)
java·全栈
唐青枫1 天前
Java Tomcat 实战指南:从 Servlet 容器到 Spring Boot 部署
java
wsaaaqqq1 天前
roudan:自由选择实体、灵活操作数据、快速写入数据库的 Java 框架
java
plainGeekDev2 天前
null 判断 → Kotlin 可空类型
android·java·kotlin
糖拌西瓜皮2 天前
Java开发者视角:深入理解Node.js异步编程模型
java·后端·node.js