leetcode 165.比较版本号 (双指针)
链接:https://leetcode-cn.com/problems/compare-version-numbers/
题目
给你两个版本号 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
示例 4:
输入:version1 = "1.0.1", version2 = "1"
输出:1
示例 5:
输入:version1 = "7.5.2.4", version2 = "7.5.3"
输出:-1
思路
这道题我一开始有双指针来判别俩个字符串每个字串的值大小的思路,不过由于对版本号字符串子串数量的情况没考虑到用直接赋结束的版本号值为0这个思路,把代码写成对每种情况的模拟,对于‘.’ 的判断也没有写好,用了find函数查找位置,导致整体代码冗杂。
class Solution {
public:
int compareVersion(string version1, string version2) {
int i1 = 0, i2 = 0;
int pos1 = version1.find('.', i1);
int pos2 = version2.find('.', i2);
int v1 = 0, v2 = 0;
while (pos1 != -1 && pos2 != -1)// 判断后面是否有子串
{
v1 = 0, v2 = 0;
while (i1<pos1 || i2<pos2)
{
if (i1<pos1)
{
v1 = v1 * 10 + version1[i1] - '0';
i1++;
}
if (i2<pos2)
{
v2 = v2 * 10 + version2[i2] - '0';
i2++;
}
}
//判断相同区间内子串大小
if (v1>v2)
return 1;
if (v1<v2)
return -1;
i1 = pos1 + 1;
pos1 = version1.find('.', pos1 + 1);
i2 = pos2 + 1;
pos2 = version2.find('.', pos2 + 1);
}
if (pos1 == -1 && pos2 == -1)
{
v1 = 0, v2 = 0;
while (i1<version1.size()|| i2<version2.size())
{
if (i1<version1.size())
{
v1 = v1 * 10 + version1[i1] - '0';
i1++;
}
if (i2<version2.size())
{
v2 = v2 * 10 + version2[i2] - '0';
i2++;
}
}
if (v1>v2)
return 1;
if (v1<v2)
return -1;
}
if (pos1 == -1 && pos2 != -1)
{
v1 = 0, v2 = 0;
while (i1<version1.size() || i2<pos2)
{
if (i1<version1.size())
{
v1 = v1 * 10 + version1[i1] - '0';
i1++;
}
if (i2<pos2)
{
v2 = v2 * 10 + version2[i2] - '0';
i2++;
}
}
if (v1>v2)
return 1;
if (v1<v2)
return -1;
i2 = pos2 + 1;
pos2 = version2.find('.', pos2 + 1);
while (pos2 != -1)
{
while (i2<pos2)
{
if (version2[i2] != '0')
return -1;
i2++;
}
i2 = pos2 + 1;
pos2 = version2.find('.', pos2 + 1);
}
while (i2<version2.size())
{
if (version2[i2] != '0')
return -1;
i2++;
}
}
if (pos1 != -1 && pos2 == -1)
{
v1 = 0, v2 = 0;
while (i1<pos1 || i2<version2.size())
{
if (i1<pos1)
{
v1 = v1 * 10 + version1[i1] - '0';
i1++;
}
if (i2<version2.size())
{
v2 = v2 * 10 + version2[i2] - '0';
i2++;
}
}
if (v1>v2)
return 1;
if (v1<v2)
return -1;
i1 = pos1 + 1;
pos1 = version1.find('.', pos1 + 1);
while (pos1 != -1)
{
while (i1<pos1)
{
if (version1[i1] != '0')
return 1;
i1++;
}
i1 = pos1 + 1;
pos1 = version1.find('.', pos1 + 1);
}
while (i1 < version1.size())
{
if (version1[i1] != '0')
return 1;
i1++;
}
}
return 0;
}
};
对上述代码进行了优化,
对双指针的的判断条件优化为i1<version1.size()||i2<version2.size()
对子串区间的判断优化为i1<version1.size()||i2<version2.size()
当其中一条版本号字符串遍历结束后,其之后每次区间比大小的值默认为0
class Solution {
public:
int compareVersion(string version1, string version2) {//双指针实现
int i1=0,i2=0;
while(i1<version1.size()||i2<version2.size())
{ int v1=0,v2=0;
while(i1<version1.size()&&version1[i1]!='.')
{
v1=v1*10+version1[i1]-'0';
i1++;
}
while(i2<version2.size()&&version2[i2]!='.')
{
v2=v2*10+version2[i2]-'0';
i2++;
}
if(v1!=v2)
return v1>v2 ? 1:-1;
i1++;
i2++;
}
return 0;
}
};

浙公网安备 33010602011771号