leetcode: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.
Here is an example of version numbers ordering:
0.1 < 1.1 < 1.2 < 13.37
分析:题意为 比较两个版本数字version1和version2,值得注意的是.并不是代表小数点,例如:2.5表示第二个一级第五个二级版本
思路:可以进行逐位比较,把字符串转化成整型。
注意考虑test case:0.1 与 0.01 结果是:0.1>0.01
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | class Solution { public : int compareVersion(string version1, string version2) { int v1, v2; int t1 = 0, t2 = 0; while (t1 < version1.length() || t2 < version2.length()) { v1 = 0; while (t1 < version1.length()) { if (version1[t1] == '.' ) { ++t1; break ; } v1 = v1 * 10 + (version1[t1] - '0' ); ++t1; } v2 = 0; while (t2 < version2.length()) { if (version2[t2] == '.' ) { ++t2; break ; } v2 = v2 * 10 + (version2[t2] - '0' ); ++t2; } if (v1 > v2) return 1; if (v1 < v2) return -1; } return 0; } }; |
其他解法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class Solution { public : int compareVersion(string version1, string version2) { const char *p1 = version1.c_str()-1; const char *p2 = version2.c_str()-1; do { int v1 = 0, v2 =0; if (p1){ v1= atoi (p1+1); p1 = strchr (p1+1, '.' ); } if (p2){ v2= atoi (p2+1); p2 = strchr (p2+1, '.' ); } if (v1<v2) return -1; if (v2<v1) return 1; } while (p1||p2); return 0; } }; |
或:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Solution { public : int compareVersion(string version1, string version2) { int n = version1.size(), m = version2.size(); for ( int i = 0, j = 0; i < n || j < m; i++, j++) { size_t p = 0; int a = ((i >= n) ? 0 : stoi(version1.substr(i), &p)); i += p; int b = ((j >= m) ? 0 : stoi(version2.substr(j), &p)); j += p; if (a > b) return 1; if (a < b) return -1; } return 0; } }; |
或:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Solution { public : int compareVersion(string version1, string version2) { istringstream iss1(version1), iss2(version2); string token1, token2; while (!iss1.eof() || !iss2.eof()) { getline(iss1, token1, '.' ); getline(iss2, token2, '.' ); if (stoi(token1) > stoi(token2)) return 1; if (stoi(token1) < stoi(token2)) return -1; token1 = token2 = "0" ; } return 0; } }; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理