版本

192 阅读5分钟

题目概括 给定两个版本号 version1 和 version2,请你比较它们的大小。

版本号由若干个以 . 为分隔符的数字组成,每个数字都是非负整数。 比较版本号时,需要逐个数字比较,直到找到不同的数字或者版本号结束。 题目要求 如果 version1 比 version2 大,返回 1。 如果 version1 比 version2 小,返回 -1。 如果 version1 等于 version2,返回 0。 输入:

两个版本号,version1 和 version2,都包含数字和点(.),且可能包含前导零。 输出:

整数 1、-1 或 0,表示比较的结果。 题目分析 这个问题的核心在于对版本号的逐个部分进行比较。每个版本号由若干个数字构成,数字之间由 . 分隔。因此,我们需要考虑以下几个问题:

版本号的拆分与处理:版本号被点号(.)分隔,拆分后每一部分应该作为整数处理。要注意前导零的情况,例如 01 和 1 应视为相同。

补充缺失的部分:版本号可能不完全对齐。例如,1.0 和 1.0.0 被视为相等,因此我们需要补充缺失的部分来确保两个版本号有相同的长度。

逐个部分的比较:两个版本号的每一部分(即数字)都要逐一比较。如果某一部分不同,我们就可以确定版本号的大小。如果所有部分都相同,则版本号相等。

解决方案 我们可以将每个版本号的数字部分分割出来,并将其转换为整数列表。然后逐一比较每个部分的大小,直到找出差异,或者判断两个版本号完全相等。

代码实现:

代码分析:

  1. 引入头文件

#include : 用于输入输出流操作,std::cout 用于打印输出,std::cin 用于输入。 #include : 用于处理字符串操作。 #include : 用于字符串流操作,主要用来将字符串按某个分隔符切割。 #include : 用于动态数组(向量),它是用来存储解析后的修订号(整数数组)的。 2. solution 函数

solution 函数的目的是比较两个版本号字符串 version1 和 version2。它返回一个整数: 1 表示 version1 比 version2 大 -1 表示 version1 比 version2 小 0 表示两个版本号相等 2.1 解析版本号

std::stringstream 是一种将字符串转换为流的方式,可以通过它像处理流数据一样处理字符串。 ss1 和 ss2 分别对应输入的 version1 和 version2,这两个字符串流对象用于逐步提取版本号中的各个部分(修订号)。 token 是一个临时变量,用于存储从字符串流中提取出来的每一个版本号部分(即修订号)。 2.2 解析每个版本号

v1 和 v2 是两个整数向量,用来存储解析后的版本号部分。std::vector 是动态数组,能够灵活地存储任意数量的整数。 接下来通过 std::getline 方法从字符串流中逐个提取版本号部分,并将每个部分转换为整数后存入 v1 和 v2 中:

std::getline(ss1, token, '.'):从字符串流 ss1 中读取数据,按 . 分割。每次读取到一个版本号部分,存储在 token 中。 std::stoi(token):将 token 转换为整数并将其加入到 v1 或 v2 向量中。 3. 比较版本号

len 是两个版本号的最大长度。由于版本号的长度可能不同(例如 "1.0.0" 和 "1.0"),我们需要补充缺失的部分。 3.1 遍历版本号的各个部分

len 是两个版本号的最大长度,for 循环将从第一个修订号开始,逐个比较两个版本号。 val1 和 val2 分别是版本号 version1 和 version2 在当前位置的修订号。如果当前版本号在该位置没有数字(即长度不够),则用 0 补充。 i < v1.size() 判断 v1 是否有第 i 个元素,若有则取出对应的版本号部分;否则,默认该位置是 0。 同理,i < v2.size() 判断 v2 是否有第 i 个元素。 3.2 比较修订号

对比 val1 和 val2: 如果 val1 > val2,则返回 1,表示 version1 大于 version2。 如果 val1 < val2,则返回 -1,表示 version1 小于 version2。

3.3 如果所有修订号都相等

如果两者在所有修订号部分都相等,那么版本号就是相等的,返回 0。 4. main 函数

main 函数调用 solution 函数来比较不同的版本号,并打印比较结果。每次比较的结果都会与预期的结果(-1、1 或 0)进行比对,输出 true 或 false。 例如,solution("0.1", "1.1") 应该返回 -1,表示 "0.1" 小于 "1.1"。 笔记算法数据结构c++写代码是一种创造性的过程,它要求逻辑思考和细致的规划。以下是我写代码的一些心得:

• 理解需求:在开始编码之前,充分理解项目需求是至关重要的。这有助于避免后期的大规模重构。

• 模块化设计:将代码分解成可管理的模块和函数,这有助于提高代码的可读性和可维护性。

• 代码复用:尽量避免重复代码,通过函数和类的复用,可以减少错误并提高开发效率。

• 测试驱动开发:编写测试用例可以帮助确保代码的可靠性,并在未来的修改中保持代码的稳定性。

• 持续学习:技术不断进步,持续学习新的编程语言和框架对于保持竞争力至关重要。

• 代码审查:通过代码审查,可以发现潜在的问题,并从同事那里获得宝贵的反馈。

• 性能优化:在保证代码正确性的同时,也要考虑性能,优化算法和数据结构的使用。

• 注释和文档:良好的注释和文档可以帮助他人更快地理解你的代码,也是未来你自己回顾代码时的重要参考。

• 耐心和细致:编程需要耐心,尤其是在调试复杂的bug时。细致的检查和逐步的测试是解决问题的关键。

• 享受过程:最后,享受编程带来的乐趣和挑战,这是保持长期动力和创造力的源泉。