字节/蚂蚁/美团/拼多多 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)如果a[i] < b[i],返回-1;

(3)如果a[i] > b[i],返回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();
    }
}
相关推荐
@#¥&~是乱码鱼啦1 小时前
AOP底层:动态代理执行流程(“断点之谜“)
java·开发语言
悲伤小伞1 小时前
LeetCode 热题 100_3-128. 最长连续序列
c++·算法·leetcode·哈希算法
page_qiu1 小时前
高并发&大数据量&毫秒级响应系统设计方案
java·前端·数据库·高并发·高响应
m0_629494732 小时前
LeetCode 热题 100-----21.搜索二维矩阵 II
数据结构·算法·leetcode
Filwaod2 小时前
Java面试现场:从Redis缓存到分布式事务,水货程序员李四的‘表演‘
java·jvm·spring boot·redis·mysql·面试·多线程
铁皮哥2 小时前
【后端开发】@Resource 和 @Autowired 到底有什么区别?为什么现在更推荐构造方法注入?
java·ide·spring boot·tomcat·log4j·idea·intellij idea
众创岛2 小时前
web自动化中的日志模块
java·前端·自动化
焦糖玛奇朵婷2 小时前
终于搞清楚了,扭蛋机小程序这么厉害❗
java·服务器·前端·程序人生·小程序
用户298698530142 小时前
Java 文档处理:在 Word 中插入分页符与分节符
java·后端