leetcode 165. 比较版本号
一、题目
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:
输入:version1 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,"01" 和 "001" 都表示相同的整数 "1"
示例 2:
输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 没有指定下标为 2 的修订号,即视为 "0"
示例 3:
输入:version1 = "0.1", version2 = "1.1"
输出:-1
解释:version1 中下标为 0 的修订号是 "0",version2 中下标为 0 的修订号是 "1" 。0 < 1,所以 version1 < version2
提示:
1 <= version1.length, version2.length <= 500
version1
和version2
仅包含数字和'.'
version1
和version2
都是 有效版本号version1
和version2
的所有修订号都可以存储在 32 位整数 中
2.基础框架
C++基础框架代码如下:
int compareVersion(string version1, string version2) {
}
3.解题思路
- 题目分析
-
首先需要将字符串
version1
和version2
以"."
为划界符分割成多个子串。 -
然后每次分割得到
version1
的子串为token1
和version2
的子串token2
,将token1
和token2
的子串中的数字进行统计。 -
token1
和token2
的长度需要分点讨论:①
token1
和token2
的长度都不为0,那将它们的数字总和sum1
与sum2
进行比较,如果sum1 > sum2
,返回1
,如果sum1 < sum2
,返回-1
。② token1和token2的长度其中至多有一个为
0
,如果token1
长度为0
,这时sum2 > 0
,的情况下,返回-1
;如果token2
长度为0
,这时sum1 > 0
的情况下,返回1
。 -
如果上面的情况都不满足,最后返回
0
。
-
实现代码:
class Solution { public: string updateString(string& str) { if (str.empty()) return str; // 如果version字符串为空,则直接返回 int end = str.find_first_of('.'); string token; if (end != string::npos) // 能找到.为划界符的情况 { token = str.substr(0, end); // 举例:str = "192.168", token = "192" str = str.substr(end + 1, str.length() - end - 1); // 更新划分后的version, 举例:str = "192.168" --> str = "168" } else // 没有.划界符的情况 { token = str.substr(0, str.length()); // 举例:str = "168", token = "168" str.clear(); // 举例:str = "168" --> str = 空串 } return token; // 返回截取后的字符串token } int compareVersion(string version1, string version2) { int i, j; string token1 = updateString(version1); string token2 = updateString(version2); int size1, size2; // token1和token2子串的长度 int sum1, sum2; // token1和token2子串的数字之和 while (token1.length() || token2.length()) { size1 = token1.length(); size2 = token2.length(); sum1 = 0, sum2 = 0; for (i = 0; i < size1; ++i) sum1 += (token1[i] - '0') * pow(10, size1 - i - 1); for (j = 0; j < size2; ++j) sum2 += (token2[j] - '0') * pow(10, size2 - j - 1); if (size1 > 0 && size2 > 0) { if (sum1 > sum2) return 1; else if (sum1 < sum2) return -1; } else { if (sum1 > 0) return 1; else if (sum2 > 0) return -1; } token1 = updateString(version1); token2 = updateString(version2); } return 0; } };
4.总结
运用string::substr()
方法分割字符串