每日一题--比较版本号

news2025/1/23 12:14:05

文章目录

    • 题目描述
      • 比较规则
      • 9种情况分析
      • 解释
      • 示例
    • 解题思路
      • 实现步骤
      • 代码实现
        • 复杂版本
        • 简化版本
      • 代码讲解
      • 复杂度分析

题目描述

在许多软件开发和版本管理系统中,版本号用于表示不同的更新或发布。通常版本号由多个修订号组成,这些修订号通过 . 连接。现在给定两个版本号 version1version2,请比较它们的大小,返回以下结果:

  • version1 大于 version2,返回 1
  • version1 小于 version2,返回 -1
  • 若二者相等,返回 0

比较规则

  1. 忽略前导零:修订号中可能有前导零,比较时忽略前导零。例如 “0.1” 和 “0.01” 应视为相等。
  2. 缺失修订号视为零:如果某个版本号缺少某个修订号,则该修订号视为零。例如 “1.1” 和 “1.1.0” 应视为相等,且 “1.1” 小于 “1.1.1”。
  3. 版本号形式:版本号至少包含一个修订号,修订号可能包含多位数字。

9种情况分析

情况编号version1字符version2字符描述
1数字字符数字字符比较两个数字字符时,将它们转换成整数进行比较。例如 1235
2数字字符.当 version2 到达 .,则认为 version2 结束,此时 version1 中的数字与 0 比较。
3.数字字符当 version1 到达 .,则认为 version1 结束,此时 version2 中的数字与 0 比较。
4数字字符\0当 version2 到达结尾 \0,则认为 version2 结束,此时 version1 中的数字与 0 比较。
5..两个版本号中的点号 . 相遇时,比较当前修订号的整数值。如果相等,则继续比较下一个修订号。
6.\0当 version2 到达结尾 \0,则认为 version2 结束,此时 version1 继续按修订号比较。
7\0数字字符当 version1 到达结尾 \0,则认为 version1 结束,此时 version2 中的数字与 0 比较。
8\0.当 version1 到达结尾 \0,则认为 version1 结束,此时 version2 中的点号与 0 比较。
9\0\0当两个版本号都结束时,如果之前的所有修订号都相等,返回 0,表示两个版本号相等。

解释

  1. 数字字符比较:如果当前字符是数字,则可以通过将字符转换为整数进行比较。
  2. 点字符(.:在版本号中,点字符用于分隔不同的修订号。当遇到点字符时,意味着当前修订号的结束,我们需要比较当前的修订号。
  3. 空字符(\0:当版本号中的字符指针到达字符串结尾时,表示该版本号结束。在此情况下,缺失的修订号应视为 0,因此进行比较时需要考虑这一点。

示例

输入输出解释
“1.1”, “2.1”-11.1 小于 2.1,所以返回 -1
“1.1”, “1.01”01.11.01 相等,忽略前导零后结果相同。
“1.1”, “1.1.1”-11.1 相当于 1.1.0,所以返回 -1
“2.0.1”, “2”12.0.1 大于 2,所以返回 1
“0.226”, “0.36”1226 大于 36,所以返回 1

解题思路

我们可以使用双指针遍历两个版本号字符串,同时按修订号进行比较。具体步骤如下:

  1. 处理前导零:通过整数处理修订号时,自动去除前导零。
  2. 缺失修订号处理:如果某个版本号没有对应的修订号,我们将该修订号视为 0
  3. 逐个比较修订号:从左到右比较修订号,直到找到大小差异或者比较完所有修订号。

实现步骤

  1. 双指针遍历版本号:使用两个指针分别指向两个版本号字符串。
  2. 提取修订号:当遇到 . 或字符串结束时,表示一个修订号结束,比较两个修订号的大小。
  3. 忽略前导零:在提取修订号时直接计算其值。
  4. 处理缺失修订号:如果一个版本号比另一个短,则视缺失的修订号为 0

代码实现

复杂版本

其实就是按照9种情况讨论:

int compare(char* version1, char* version2 ) {
    int i = 0, j = 0;

    int temp1 = 0;
    int temp2 = 0;
    while (version1[i] != '\0' || version2[j] != '\0') {
        
        if ((version2[j] != '.'&& version2[j] != '\0')&& (version1[i] != '.'&&version1[i] != '\0')) {
            temp1 = temp1 * 10 + (version1[i] - '0');
            i++;
            temp2 = temp2 * 10 + (version2[j] - '0');
            j++;
        } else if ((version2[j] == '.' || version2[j] == '\0') && (version1[i] != '.'&&version1[i] != '\0')) {
            temp1 = temp1 * 10 + (version1[i] - '0');
            i++;
        } else if ((version1[i] == '.' || version1[i] == '\0') && (version2[j] != '.'&&version2[j] != '\0')) {
            temp2 = temp2 * 10 + (version2[j] - '0');
            j++; 
           
        } else if ((version2[j] == '.' || version2[j] == '\0') && (version1[i] == '.' ||
                   version1[i] == '\0')) {
            if (temp1 > temp2)
                return 1;
            if (temp1 < temp2)
                return -1;
            else {
                temp1 = 0;
                temp2 = 0;
                if (version1[i] == '.')i++;
                if (version2[j] == '.')j++;
            }

        } else break;
      
    }
    if (temp1 > temp2){
        
         return 1;}
       
    else if (temp1 < temp2)
        return -1;
    else  return 0;
    // write code here

}

简化版本

其实完全没必要,明明很简单的思路,自己非搞得极度麻烦。

int compare(char* version1, char* version2) {
    int i = 0, j = 0;
    int temp1 = 0, temp2 = 0;
    
    while (version1[i] != '\0' || version2[j] != '\0') {
        // 处理版本号1和版本号2的当前修订号
        temp1 = 0; temp2 = 0;
        
        // 处理version1和version2的当前修订号
        while (version1[i] != '.' && version1[i] != '\0') {
            temp1 = temp1 * 10 + (version1[i] - '0');
            i++;
        }
        
        while (version2[j] != '.' && version2[j] != '\0') {
            temp2 = temp2 * 10 + (version2[j] - '0');
            j++;
        }
        
        // 比较修订号
        if (temp1 > temp2) {
            return 1; // version1 > version2
        }
        if (temp1 < temp2) {
            return -1; // version1 < version2
        }
        
        // 处理 '.' 位置
        if (version1[i] == '.') i++;
        if (version2[j] == '.') j++;
    }
    
    return 0; // version1 == version2
}

代码讲解

  1. 初始化:定义两个指针 ij,分别指向 version1version2 的当前位置。temp1temp2 用来存储当前修订号的值。

  2. 遍历修订号

    • 使用两个 while 循环分别提取两个版本号中的当前修订号。每次遇到 . 或字符串结束时,就结束当前修订号的提取。
  3. 比较修订号:当提取出两个修订号时,比较它们的大小:

    • 如果 temp1 > temp2,返回 1,表示 version1 更大。
    • 如果 temp1 < temp2,返回 -1,表示 version1 更小。
    • 如果相等,继续处理下一个修订号。
  4. 跳过点号:如果当前字符是 .,跳过它,继续处理下一个修订号。

  5. 结束条件:当遍历完两个版本号时,如果没有发现大小差异,说明它们相等,返回 0

复杂度分析

  • 时间复杂度:每次我们都在字符串上按修订号进行遍历,因此时间复杂度是 O(n),其中 n 是两个版本号字符串的最大长度。
  • 空间复杂度:只有几个整型变量用于存储索引和临时值,空间复杂度是 O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2280891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构——实验二·栈

海~~欢迎来到Tubishu的博客&#x1f338;如果你也是一名在校大学生&#xff0c;正在寻找各种变成资源&#xff0c;那么你就来对地方啦&#x1f31f; Tubishu是一名计算机本科生&#xff0c;会不定期整理和分享学习中的优质资源&#xff0c;希望能为你的编程之路添砖加瓦⭐&…

【IEEE Fellow 主讲报告| EI检索稳定】第五届机器学习与智能系统工程国际学术会议(MLISE 2025)

重要信息 会议时间地点&#xff1a;2025年6月13-15日 中国深圳 会议官网&#xff1a;http://mlise.org EI Compendex/Scopus稳定检索 会议简介 第五届机器学习与智能系统工程国际学术会议将于6月13-15日在中国深圳隆重召开。本次会议旨在搭建一个顶尖的学术交流平台&#xf…

一文详解Filter类源码和应用

背景 在日常开发中&#xff0c;经常会有需要统一对请求做一些处理&#xff0c;常见的比如记录日志、权限安全控制、响应处理等。此时&#xff0c;ServletApi中的Filter类&#xff0c;就可以很方便的实现上述效果。 Filter类 是一个接口&#xff0c;属于 Java Servlet API 的一部…

开发环境搭建-1:配置 WSL (类 centos 的 oracle linux 官方镜像)

一些 Linux 基本概念 个人理解&#xff0c;并且为了便于理解&#xff0c;可能会存在一些问题&#xff0c;如果有根本上的错误希望大家及时指出 发行版 WSL 的系统是基于特定发行版的特定版本的 Linux 发行版 有固定组织维护的、开箱就能用的 Linux 发行版由固定的团队、社区…

llama-2-7b权重文件转hf格式及模型使用

目录 1. obtain llama weights 2. convert llama weights files into hf format 3. use llama2 to generate text 1. obtain llama weights &#xff08;1&#xff09;登录huggingface官网&#xff0c;搜索llama-2-7b &#xff08;2&#xff09;填写申请表单&#xff0c;VP…

ElasticSearch(十一)— Elasticsearch中的SQL语句

一、总概 Elasticsearch 在 Basic 授权中支持以 SQL 语句的形式检索文档&#xff0c;SQL 语句在执行时会被翻译为 DSL 执行。从语法的角度来看&#xff0c;Elastisearch 中的 SQL 语句与RDBMS 中的 SQL 语句基本一致&#xff0c; 所以对于有数据库编程基础的人来说大大降低了使…

吴恩达深度学习——如何实现神经网络

来自吴恩达深度学习&#xff0c;仅为本人学习所用。 文章目录 神经网络的表示计算神经网络的输出激活函数tanh选择激活函数为什么需要非激活函数双层神经网络的梯度下降法 随机初始化 神经网络的表示 对于简单的Logistic回归&#xff0c;使用如下的计算图。 如果是多个神经元…

爬取NBA球员信息并可视化小白入门

网址:虎扑体育-NBA球员得分数据排行 第1页 步骤: 分析页面 确定URL地址模拟浏览器向服务器发送请求数据解析 提取想要的数据保存数据 爬虫所需要的模块 requests(发送HTTP请求)parsel(解析HTML内容)pandas(数据保存模块) 第一步分析页面 --确定是静态页面还是动态页面 右击点…

C语言初阶牛客网刷题——JZ17 打印从1到最大的n位数【难度:入门】

1.题目描述 牛客网OJ题链接 题目描述&#xff1a; 输入数字 n&#xff0c;按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3&#xff0c;则打印出 1、2、3 一直到最大的 3 位数 999。 用返回一个整数列表来代替打印n 为正整数&#xff0c;0 < n < 5 示例1 输入&…

寒假刷题记录

4968. 互质数的个数 - AcWing题库 涉及&#xff1a;快速幂&#xff0c;欧拉函数&#xff0c;分解质因数 #include <bits/stdc.h> #define fi first #define se second #define endl \n #define pb push_backusing namespace std; using LL long long;const int mod 9…

OSI5GWIFI自组网协议层次对比

目录 5G网络5G与其他协议栈各层映射 5G网络 物理层 (PHY) 是 5G 基站协议架构的最底层&#xff0c;负责将数字数据转换为适合无线传输的信号&#xff0c;并将接收到的无线信号转换为数字数据。实现数据的编码、调制、多天线处理、资源映射等操作。涉及使用新的频段&#xff08…

Java高频面试之SE-16

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本牛马baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; Java中异常的处理方式有哪些&#xff1f; 在 Java 中&#xff0c;异常的处理方式主要有以下几种&#xff1a; 1. 使用 try-catch 语句 …

HTML中的`<!DOCTYPE html>`是什么意思?

诸神缄默不语-个人CSDN博文目录 在学习HTML时&#xff0c;我们经常会看到HTML文档的开头出现<!DOCTYPE html>&#xff0c;它是HTML文件的第一行。很多初学者可能会疑惑&#xff0c;为什么需要这行代码&#xff1f;它到底有什么作用呢&#xff1f;在这篇文章中&#xff0…

Games104——游戏中地形大气和云的渲染

原文链接 原文链接 这里写目录标题 地形的几何Heightfield高程图网格自适应细分三角形的剖分二叉树T-Junctions四叉树TIN&#xff08;Triangulated Irregular Network&#xff09;不规则三角形网格 GPU Drived Tessellator(Hardware Tessellation)Mesh ShaderNon-HeightField…

Springboot自动配置的原理

先拿redis来举个例子 第一步导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 第二步配置 spring: redis: database:host:127.0.0.1 port…

【动态规划】落花人独立,微雨燕双飞 - 8. 01背包问题

本篇博客给大家带来的是01背包问题之动态规划解法技巧. &#x1f40e;文章专栏: 动态规划 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; 要开心要快乐顺便…

记一次虚机上传过慢问题排查

最近线上虚机有个特殊的用户反馈&#xff0c;用户反馈虚机从A服务器下载文件特别慢&#xff0c;于是scp A服务器数据到本地client&#xff0c;发现 只有几十K的流量。 当时第一反应怀疑是虚机负载压力比较大&#xff0c;但是查看虚机IO以及负载都很低。。。。 然后tcpdump抓包发…

web服务器 网站部署的架构

WEB服务器工作原理 Web web是WWW(World Wide Web)的简称&#xff0c;基本原理是&#xff1a;请求(客户端)与响应(服务器端)原理&#xff0c;由遍布在互联网中的Web服务器和安装了Web浏览器的计算机组成 客户端发出请求的方式&#xff1a;地址栏请求、超链接请求、表单请求 …

数据结构——实验七·排序

嗨~~欢迎来到Tubishu的博客&#x1f338;如果你也是一名在校大学生&#xff0c;正在寻找各种编程资源&#xff0c;那么你就来对地方啦&#x1f31f; Tubishu是一名计算机本科生&#xff0c;会不定期整理和分享学习中的优质资源&#xff0c;希望能为你的编程之路添砖加瓦⭐&…

Windows系统提示RunDLL PcaWallpaperAppDetect错误修复方法

最近&#xff0c;Win11 24H2预览版和Win10 LTSC 2025功能更新偶尔会触发RunDLL错误弹窗 具体表现为 //英文提示 Error in C:\WINDOWS\system32\PcaSvc.dll Missing entry: PcaWallpaperAppDetect//中文提示 C:\WINDOWS\system32\PcaSvc.dll出错 丢失条目:PcaWallpaperAppDe…