【leetcode热题】比较版本号

news/2024/6/19 0:40:33 标签: leetcode, linux, 算法
  • 难度: 中等
  • 通过率: 22.1%
  • 题目链接:. - 力扣(LeetCode)

题目描述

比较两个版本号 version1 和 version2
如果 version1 version2 返回 1,如果 version1 version2 返回 -1, 除此之外返回 0

你可以假设版本字符串非空,并且只包含数字和 . 字符。

 . 字符不代表小数点,而是用于分隔数字序列。

例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。

示例 1:

输入: version1 = "0.1", version2 = "1.1"
输出: -1

示例 2:

输入: version1 = "1.0.1", version2 = "1"
输出: 1

示例 3:

输入: version1 = "7.5.2.4", version2 = "7.5.3"
输出: -1

解法一

这道题今年笔试的时候遇到好几次了,没想到竟然是 leetcode 的原题。思路很简单,按照「点」对版本号进行切割,然后依次比较每个数字即可。

切割的话涉及到 java 语言的一个特性,. 在正则里有特殊含义,所以我们需要进行转义。

这里切割出来的是字符串,所以我们需要把字符串转为数字,因为字符串转数字不是这道题的重点,所以直接调用系统提供的 Integer.parseInt 即可。

public int compareVersion(String version1, String version2) {
    String[] nums1 = version1.split("\\.");
    String[] nums2 = version2.split("\\.");
    int i = 0, j = 0;
    while (i < nums1.length || j < nums2.length) {
        //这个技巧经常用到,当一个已经遍历结束的话,我们将其赋值为 0
        String num1 = i < nums1.length ? nums1[i] : "0";
        String num2 = j < nums2.length ? nums2[j] : "0";
        int res = compare(num1, num2);
        if (res == 0) {
            i++;
            j++;
        } else {
            return res;
        }
    }
    return 0;
}

private int compare(String num1, String num2) {
    int n1 = Integer.parseInt(num1);
    int n2 = Integer.parseInt(num2);
    if (n1 > n2) {
        return 1;
    } else if (n1 < n2) {
        return -1;
    } else {
        return 0;
    }
}

解法二

上边的解法可以成功 AC,但是如果数字过大的话,int 是无法保存的。所以我们可以不把字符串转为数字,而是直接用字符串比较。

public int compareVersion(String version1, String version2) {
    String[] nums1 = version1.split("\\.");
    String[] nums2 = version2.split("\\.");
    int i = 0, j = 0;
    while (i < nums1.length || j < nums2.length) {
        String num1 = i < nums1.length ? nums1[i] : "0";
        String num2 = j < nums2.length ? nums2[j] : "0";
        int res = compare(num1, num2);
        if (res == 0) {
            i++;
            j++;
        } else {
            return res;
        }
    }
    return 0;
}

private int compare(String num1, String num2) {
    //将高位的 0 去掉
    num1 = removeFrontZero(num1);
    num2 = removeFrontZero(num2);
    //先根据长度进行判断
    if (num1.length() > num2.length()) {
        return 1;
    } else if (num1.length() < num2.length()) {
        return -1;
    } else {
        //长度相等的时候
        for (int i = 0; i < num1.length(); i++) {
            if (num1.charAt(i) - num2.charAt(i) > 0) {
                return 1;
            } else if (num1.charAt(i) - num2.charAt(i) < 0) {
                return -1;
            }
        }
        return 0;
    }
}

private String removeFrontZero(String num) {
    int start = 0;
    for (int i = 0; i < num.length(); i++) {
        if (num.charAt(i) == '0') {
            start++;
        } else {
            break;
        }
    }
    return num.substring(start);
}

http://www.niftyadmin.cn/n/5432786.html

相关文章

【网站项目】320社区物业管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

西电微原课设介绍

一、引言 西电微原课设&#xff0c;即西安电子科技大学微电子学院的原理课程设计&#xff0c;是微电子专业学生在大学期间进行的一项重要实践环节。该课程旨在通过实际项目的设计与实施&#xff0c;加深学生对微电子原理、集成电路设计等理论知识的理解&#xff0c;并培养学生…

C#常见的.Net类型(一)

目录 一、处理数字二、处理文本三、模式匹配与正则表达式 一、处理数字 常见的数据类型之一是数字&#xff0c;.NET用于处理数字的最常见类型 示例类型描述int用于表示整数值&#xff0c;没有小数部分byte用于表示8位无符号整数double用于表示双精度浮点数decimal用于表示高精…

二维数组_计算矩阵边缘元素之和

任务描述 输入一个整数矩阵&#xff0c;计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。 输入格式: 第一行分别为矩阵的行数m和列数n&#xff08;m < 100&#xff0c;n < 100&#xff09;&#x…

【ERP原理与应用】作业·思考题二

第三周 1. 简述物料编码的概念。什么是物料编码的唯一性&#xff1f;物料编码体系的建立遵循什么设计原则&#xff1f; 物料编码概念、唯一性和设计原则 物料编码是对物料进行唯一标识的一种方式&#xff0c;通常由数字、字母或符号组成&#xff0c;用于在供应链管理和库存控…

HTML静态网页成品作业(HTML+CSS)——家乡广州介绍设计制作(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…

同城预约上门服务APP小程序开发 打造快捷便利生活

随着移动互联网的快速发展&#xff0c;人们的生活方式正在发生深刻的变化。特别是在城市生活中&#xff0c;人们越来越依赖移动应用来解决日常生活中的各种问题。其中&#xff0c;同城预约上门服务APP正成为一种新型的生活服务平台&#xff0c;为人们提供了更加便利和快捷的服务…

Docker 哲学 - 容器操作

容器&#xff1a; 创建 停止 删除 强制删除&#xff08;正在运行&#xff09; run stop rm rm -f 列出本地容器&#xff1a; docker ps / docker container ls 镜像&#xff1a; search pull run &#xff1a; …