🧮 Algorithm Notebook
1、算法准备
1.1 牛客网编程OJ的典型输入输出
2、算法框架
2.1 动态规划
2.1.1 斐波那契数列
2.1.2 背包问题
2.1.3 贪心算法
2.1.4 序列和数组类问题
2.1.5 编辑距离
2.1.6 高楼扔鸡蛋
2.1.7 股票问题系列通解
2.1.8 最长有效括号
2.1.9 剪绳子
2.1.10 正则表达式匹配
2.2 二分查找
2.2.1 二分查找框架
2.2.2 搜索旋转排序数组
2.3 链表
2.3.1 反转链表
2.3.2 相交链表
2.3.3 合并链表
2.3.4 链表中倒数第k个节点
2.3.5 复制带随机指针的链表
2.4 排序算法
2.4.1 常见排序算法
2.5 二叉树
2.5.1 二叉树遍历
2.5.2 岛屿问题
2.5.3 二叉树路径问题
2.5.4 构造二叉树
2.6 回溯算法
2.6.1 回溯算法解题框架
2.6.2 N皇后
2.7 数组
2.7.1 删除有序数组中的重复项
2.7.2 滑动窗口最大值
2.7.3 调整数组顺序使奇数位于偶数前面
2.7.4 螺旋矩阵
2.7.5 多数元素
2.7.6 最大数
2.7.7 和为s的两个数字
2.7.8 构建乘积数组
2.7.9 两数之和
2.8 字符串
2.8.1 最小覆盖子串
2.8.2 比较版本号
2.8.3 验证IP地址
2.8.4 基本计算器 II
2.8.5 字符串解码
2.8.6 移掉 K 位数字
2.8.7 无重复字符的最长子串
2.8.8 第一个只出现一次的字符
2.8.9 翻转字符串里的单词
2.8.10 字符串转换整数 (atoi)
2.8.11 字符串四则运算
2.9 栈
2.9.1 最小栈
2.9.2 弹出序列
2.10 数学
2.10.1 用 Rand7() 实现 Rand10()
2.10.2 只出现一次的数字
2.10.3 整数反转
2.10.4 求1+2+…+n
2.10.5 二进制中1的个数
2.10.6 幂运算
2.10.7 1~n 整数中 1 出现的次数
2.10.8 数字序列中某一位的数字
2.10.9 丑数
2.10.10 n个骰子的点数
2.10.11 圆圈中最后剩下的数字
2.10.12 不用加减乘除做加法
2.10.13 x 的平方根
2.11 设计
2.11.1 LRU 缓存机制
-
+
tourist
register
Sign in
比较版本号
## 1 题目 给你两个版本号 version1 和 version2 ,请你比较它们。 版本号由一个或多个修订号组成,各修订号由一个 '.' 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。 比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较 忽略任何前导零后的整数值 。也就是说,修订号 1 和修订号 001 相等 。如果版本号没有指定某个下标处的修订号,则该修订号视为 0 。例如,版本 1.0 小于版本 1.1 ,因为它们下标为 0 的修订号相同,而下标为 1 的修订号分别为 0 和 1 ,0 < 1 。 返回规则如下: * 如果 version1 > version2 返回 1, * 如果 version1 < version2 返回 -1, * 除此之外返回 0。 **示例 1:** ```txt 输入:version1 = "1.01", version2 = "1.001" 输出:0 解释:忽略前导零,"01" 和 "001" 都表示相同的整数 "1" ``` **示例 2:** ```txt 输入:version1 = "1.0", version2 = "1.0.0" 输出:0 解释:version1 没有指定下标为 2 的修订号,即视为 "0" ``` **示例 3:** ```txt 输入:version1 = "0.1", version2 = "1.1" 输出:-1 解释:version1 中下标为 0 的修订号是 "0",version2 中下标为 0 的修订号是 "1" 。0 < 1,所以 version1 < version2 ``` **示例 4:** ```txt 输入:version1 = "1.0.1", version2 = "1" 输出:1 ``` **示例 5:** ```txt 输入:version1 = "7.5.2.4", version2 = "7.5.3" 输出:-1 ``` **提示:** * 1 <= version1.length, version2.length <= 500 * version1 和 version2 仅包含数字和 '.' * version1 和 version2 都是 有效版本号 * version1 和 version2 的所有修订号都可以存储在 32 位整数 中 ## 2 问题分析 1. 针对该题目,我们可以采用**双指针**的方法来解决,具体思路如下: 1. **定义两个指针 $i$ 和 $j$**,**初始化 $i = 0$**,$j = 0$**。** 2. **两个指针分别遍历两个字符串**,**将每个小数点 `.` 分隔开的修订号解析成数字**,**并进行大小比较**(这样做**可以直接去前导 0**,同时**将字符串转换成数字也便于比较大小**): 1. **如果 $num1 \gt num2$**,**返回 1**。 2. **如果 $num1 \lt num2$**,**返回-1**。 3. $i++$、$j++$,**两个指针都后移一步**,**进行下一轮的修订号解析比较**。 4. **如果遍历完两个字符串都没有返回相应结果**,**说明两个字符串相等**,**返回 0**。 ## 3 参考代码 ```java /** * 165. 比较版本号 * @param version1 版本号 1 * @param version2 版本号 2 * @return 两个版本号的比较结果 */ public int compareVersion(String version1, String version2) { int m = version1.length(), n = version2.length(); int i = 0, j = 0; while (i < m || j < n) { int num1 = 0, num2 = 0; while (i < m && version1.charAt(i) != '.') {num1 = num1 * 10 + version1.charAt(i++) - '0';} while (j < n && version2.charAt(j) != '.') {num2 = num2 * 10 + version2.charAt(j++) - '0';} if (num1 > num2) {return 1;} else if (num1 < num2) {return -1;} ++i; ++j; } return 0; } ``` ## 参考文献 1. [165. 比较版本号](https://leetcode-cn.com/problems/compare-version-numbers)。 2. [比较版本号 | 双指针算法超清晰讲解 【c++/java 版本】](https://leetcode-cn.com/problems/compare-version-numbers/solution/bi-jiao-ban-ben-hao-shuang-zhi-zhen-suan-bcv7)。
ricear
Nov. 14, 2021, 9:06 p.m.
©
BY-NC-ND(4.0)
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
share
link
type
password
Update password