iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现LeetCode165.版本比较)
  • 389
分享到

C++实现LeetCode165.版本比较)

2024-04-02 19:04:59 389人浏览 八月长安
摘要

[LeetCode] 165.Compare Version Numbers 版本比较 Compare two version numbers version1 

[LeetCode] 165.Compare Version Numbers 版本比较

Compare two version numbers version1 and version2.
If version1 > version2 return 1; if version1 <version2 return -1;otherwise return 0.

You may assume that the version strings are non-empty and contain only digits and the . character.
The . character does not represent a decimal point and is used to separate number sequences.
For instance, 2.5 is not "two and a half" or "half way to version three", it is the fifth second-level revision of the second first-level revision.

Example 1:

Input: version1 = "0.1", version2 = "1.1"
Output: -1

Example 2:

Input: version1 = "1.0.1", version2 = "1"
Output: 1

Example 3:

Input: version1 = "7.5.2.4", version2 = "7.5.3"
Output: -1

Credits:
Special thanks to @ts for adding this problem and creating all test cases.

这道题调试了好久,一直不想上网搜别人的解法,因为感觉自己可以做出来,改来改去最后终于通过了,再上网一搜,发现果然和别人的方法不同,小有成就感。我的思路是:由于两个版本号所含的小数点个数不同,有可能是1和1.1.1比较,还有可能开头有无效0,比如01和1就是相同版本,还有可能末尾无效0,比如1.0和1也是同一版本。对于没有小数点的数字,可以默认为最后一位是小数点,而版本号比较的核心思想是相同位置的数字比较,比如题目给的例子,1.2和13.37比较,我们都知道应该显示1和13比较,13比1大,所以后面的不用再比了,再比如1.1和1.2比较,前面都是1,则比较小数点后面的数字。那么算法就是每次对应取出相同位置的小数点之前所有的字符,把他们转为数字比较,若不同则可直接得到答案,若相同,再对应往下取。如果一个数字已经没有小数点了,则默认取出为0,和另一个比较,这样也解决了末尾无效0的情况。代码如下:

解法一:


class Solution {
public:
    int compareVersion(string version1, string version2) {
        int n1 = version1.size(), n2 = version2.size();
        int i = 0, j = 0, d1 = 0, d2 = 0;
        string v1, v2;
        while (i < n1 || j < n2) {
            while (i < n1 && version1[i] != '.') {
                v1.push_back(version1[i++]);
            }
            d1 = atoi(v1.c_str());
            while (j < n2 && version2[j] != '.') {
                v2.push_back(version2[j++]);
            }
            d2 = atoi(v2.c_str());
            if (d1 > d2) return 1;
            else if (d1 < d2) return -1;
            v1.clear(); v2.clear();
            ++i; ++j;
        }
        return 0;
    }
};

当然我们也可以不使用将字符串转为整型的atoi函数,我们可以一位一位的累加,参加如下代码:

解法二:


class Solution {
public:
    int compareVersion(string version1, string version2) {
        int n1 = version1.size(), n2 = version2.size();
        int i = 0, j = 0, d1 = 0, d2 = 0;
        while (i < n1 || j < n2) {
            while (i < n1 && version1[i] != '.') {
                d1 = d1 * 10 + version1[i++] - '0';
            }
            while (j < n2 && version2[j] != '.') {
                d2 = d2 * 10 + version2[j++] - '0';
            }
            if (d1 > d2) return 1;
            else if (d1 < d2) return -1;
            d1 = d2 = 0;
            ++i; ++j;
        }
        return 0;
    }
};

由于这道题我们需要将版本号以'.'分开,那么我们可以借用强大的字符串流stringstream的功能来实现分段和转为整数,使用这种方法写的代码很简洁,如下所示:

解法三:


class Solution {
public:
    int compareVersion(string version1, string version2) {
        istringstream v1(version1 + "."), v2(version2 + ".");
        int d1 = 0, d2 = 0;
        char dot = '.';
        while (v1.Good() || v2.good()) {
            if (v1.good()) v1 >> d1 >> dot;
            if (v2.good()) v2 >> d2 >> dot;
            if (d1 > d2) return 1;
            else if (d1 < d2) return -1;
            d1 = d2 = 0;
        }
        return 0;
    }
};

最后我们来看一种用C语言的字符串指针来实现的方法,这个方法的关键是用到将字符串转为长整型的strtol函数,关于此函数的用法可以参见我的另一篇博客strtol 函数用法。参见代码如下:

解法四:


class Solution {
public:
    int compareVersion(string version1, string version2) {
        int res = 0;
        char *v1 = (char*)version1.c_str(), *v2 = (char*)version2.c_str();
        while (res == 0 && (*v1 != '\0' || *v2 != '\0')) {
            long d1 = *v1 == '\0' ? 0 : strtol(v1, &v1, 10);
            long d2 = *v2 == '\0' ? 0 : strtol(v2, &v2, 10);
            if (d1 > d2) return 1;
            else if (d1 < d2) return -1;
            else {
                if (*v1 != '\0') ++v1;
                if (*v2 != '\0') ++v2;
            }
        }
        return res;
    }
};

类似题目:

First Bad Version

参考资料:

https://leetcode.com/problems/compare-version-numbers/discuss/?orderBy=most_votes

Https://leetcode.com/problems/compare-version-numbers/discuss/50774/Accepted-small-Java-solution.

https://leetcode.com/problems/compare-version-numbers/discuss/50788/My-JAVA-solution-without-split

https://leetcode.com/problems/compare-version-numbers/discuss/50804/10-line-concise-solution.-(C%2B%2B)

https://leetcode.com/problems/compare-version-numbers/discuss/50767/My-2ms-easy-solution-with-CC%2B%2B

到此这篇关于c++实现LeetCode165.版本比较)的文章就介绍到这了,更多相关C++实现版本比较内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++实现LeetCode165.版本比较)

本文链接: https://www.lsjlt.com/news/131577.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++实现LeetCode165.版本比较)
    [LeetCode] 165.Compare Version Numbers 版本比较 Compare two version numbers version1 ...
    99+
    2024-04-02
  • C++实现LeetCode之版本比较的示例分析
    小编给大家分享一下C++实现LeetCode之版本比较的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧![LeetCode] 165.Compare Ver...
    99+
    2023-06-20
  • PHP哪个版本比较好
    这篇文章给大家分享的是有关PHP哪个版本比较好的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。经常有站长在搭建环境的时候问我PHP哪个版本更好?哪个版本更稳定?  一般情况,版本越新越好,比如PHP5.6/7.0就...
    99+
    2023-06-15
  • Linux哪个版本比较好用
    本篇内容介绍了“Linux哪个版本比较好用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  Linux系统是目前比较常见的操作系统,尤其是在...
    99+
    2023-06-05
  • mysql哪个版本比较稳定
    今天就跟大家聊聊有关mysql哪个版本比较稳定,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。mysql哪个版本比较稳定MySQL的选择要取决于用途的...
    99+
    2024-04-02
  • MySQL各版本的比较分析
    小编给大家分享一下MySQL各版本的比较分析,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产...
    99+
    2024-04-02
  • python下载哪个版本比较好
    您工作的领域和需求决定了最适合您的 python 版本。数据科学和机器学习建议 python 3.6 及以上版本,web 开发建议 python 3.9 及以上版本,脚本和自动化可选择 ...
    99+
    2024-04-02
  • 版本号对比 -- Python实现
    相同位数版本号大小比较: 1 def abc(str1, str2): 2 if str1 == "" or str2 == "": 3 print("输入包含空字符串,请重新输入") 4 ...
    99+
    2023-01-31
    版本号 Python
  • C++怎么实现比较日期大小
    今天小编给大家分享一下C++怎么实现比较日期大小的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、目的用来比较两个日期。日期...
    99+
    2023-07-05
  • 【Java学习】-Java JDK 1.8与17版本比较
    前言 Java Development Kit(JDK)是Java编程语言的开发环境。它包含了Java编译器(javac)、Java虚拟机(JVM)以及其他必需的工具和库。本文将比较JDK 1.8和17两个版本,分析它们的发展历史和地位...
    99+
    2023-08-16
    java 学习 jvm
  • python什么版本比较稳定,哪个版本的python最好用
    大家好,小编来为大家解答以下问题,python哪个版本最好用又稳定,哪个版本的python最好用,今天让我们一起来看看吧! 其实很多人想知道python软件哪个版本好用,工欲善其事必先利其器,这是能理解的,下面小编个...
    99+
    2023-09-23
    python
  • GoJava算法之比较版本号方法详解
    目录比较版本号方法一:字符串切割(Java)方法二:双指针(Go)比较版本号 给你两个版本号 version1 和 version2 ,请你比较它们。 版本号由一个或多个修订号组成,...
    99+
    2022-11-13
    Go Java算法比较版本号 Go Java版本号比较
  • JDK8 和 JDK11 Java 两个主要版本的比较
    引言: Java 是一门广泛应用于企业级应用和跨平台开发的编程语言。随着时间的推移,Java 不断演变和发展,版本之间有着许多新的功能和改进。本篇博客将重点关注 JDK 8 和 JDK 11 之间的区别,分析它们的新特性、性能改进和其他...
    99+
    2023-09-06
    java 开发语言
  • python怎么实现余弦相似度文本比较
    这篇文章将为大家详细讲解有关python怎么实现余弦相似度文本比较,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问...
    99+
    2023-06-14
  • python实现时间的比较
    下面介绍下Python中比较两个日期大小的脚本. 在实际工作中用到,以供后续参考及备忘 时间区间比较函数 import time # 这里比较l_t...
    99+
    2023-01-31
    时间 python
  • C#实现获取文件大小并进行比较
    目录一、实现功能二、核心脚本三、使用方法一、实现功能 ①需要获取到文件的大小然后进行合适单位的展示; ②将获取到的文件大小统一单位; ③能够进行文件大小与设置数值比较; ④两个文件比...
    99+
    2023-03-15
    C#获取文件大小 C# 文件大小
  • C++实现比较日期大小的示例代码
    目录一、目的二、代码三、补充一、目的 用来比较两个日期。日期格式:2023-03-31 09:16:56。 二、代码 //std::wstring strA = L"2023-03-...
    99+
    2023-05-14
    C++比较日期大小 C++比较日期 C++ 日期
  • python实现余弦相似度文本比较的示例
    目录向量空间模型VSM:VSM的介绍:VSM的例子:TF-IDF权重计算:TF的由来:IDF的出现:TF-IDF的计算:余弦相似度的计算:文本比较实例:对文本进行去停用词和分词:余弦...
    99+
    2024-04-02
  • mysql如何实现比较运算
    这篇文章将为大家详细讲解有关mysql如何实现比较运算,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。MySQL按照以下规则进行数值比较:若有一个或两个参数为 NULL,除...
    99+
    2024-04-02
  • java如何实现数值比较
    这篇文章主要为大家展示了“java如何实现数值比较”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java如何实现数值比较”这篇文章吧。java数值比较impor...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作