字节/蚂蚁/美团/拼多多 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();
    }
}
相关推荐
城管不管7 分钟前
重生——第十次面试之开源中国一面挂
java·linux·开发语言·算法·面试·职场和发展·开源
Java小白笔记11 分钟前
Windows系统免软件命令激活
java·网络·人工智能·windows·ai·ai编程
爱敲键盘的猴子20 分钟前
深入理解 Java HashMap
java·hashmap
霸道流氓气质20 分钟前
Java开发者AI编程常用MCP、Skills、Rules全景汇总
java·开发语言·ai编程
天涯醉青楼32 分钟前
Spring Boot 接口返回 Bean 时字段名“变形”的深度剖析与解决方案
java
步行cgn1 小时前
MyBatis 高级映射与延迟加载完全指南
java·tomcat·mybatis
thefool1122661 小时前
从中序与后序遍历序列构造二叉树
java
吴声子夜歌1 小时前
Java面试题——JVM(二)
java·开发语言·jvm
CRMEB1 小时前
商城大促活动策划全流程:从定目标到复盘四阶段
java·开发语言·人工智能·ai·开源·php
denglinqings1 小时前
Java开发从入门到精通所有课程
java·开发语言