字节/蚂蚁/美团/拼多多 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();
    }
}
相关推荐
小朱爱编程1232 分钟前
我用 Jev 做了三个实用工具:整理标签页、分诊飞书反馈、找回 GitHub 收藏
java·开发语言·人工智能·后端·python·架构·ai编程
酷虎软件16 分钟前
视频加标题字幕 API 接口文档
java·数据库·mysql
谢亮_vipxieliang26 分钟前
Java 8/11/17/21/25 怎么选?一篇讲清 LTS 升级路线
java·开发语言
Cindy_cd35 分钟前
IDEA2021 配置 JDK+Maven
java·开发语言·maven
blxr_43 分钟前
力扣hot100爬楼梯https://leetcode.cn/problems/climbing-stairs/
算法·leetcode·职场和发展
我要神龙摆尾1 小时前
IDEA 阅读插件
java·ide·intellij-idea·idea-plugs·plugs
涉密IT资质笔记2 小时前
涉密人员脱密期管理规范:期限分级模型、就业限制边界与违规认定标准
java·服务器·前端·网络·数据库
mmsx2 小时前
Android Dialog 插槽模式:用一套壳统一全应用的弹窗风格
android·java·dialog·开发语言
u0111026752 小时前
工具页案例图如何编写 alt让图片说明与处理场景对应
java·前端·javascript·图像处理·人工智能·算法·ai作画
码上有光2 小时前
Linux:进程间通信——匿名管道通信、命名管道通信
android·java·linux·linux通信·匿名通信·命名通信