本文已参与「新人创作礼」活动,一起开启掘金创作之路。
给你两个版本号 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 位整数 中
思路: 方法一: 首先看到题目肯定第一时间想到的是把字符串给分开,这样就可以直接进行比较了,所以可以使用split的方法来进行直接按照符号小数点来分割,此处就不做代码展示了.
方法二: 另一种更高效的方法可以使用双指针来进行运算.设置两个指针都分别从两个字符串的首字母开始,一旦到末尾或者是遇到小数点就停止 并且每次都把对应的字符形式的数字通过减去'0'的方法来在num里面累加,这样在处理完两个字符串之后就可以直接进行整数形式的比较了.但要注意,题目中要求的是32位整数,所以定义类型的时候不要马虎,需要长一点.
代码区:
class Solution {
public:
int compareVersion(string version1, string version2) {
int i = 0, j = 0;//定义两个指针,分别从各自字符串的第一个开始
while(i < version1.size() || j < version2.size()){//当还没有到末尾时
long long num1 = 0, num2 = 0;
//注意这里需要使用longlong,题目要求的32位整数 要不然遇到大数字就存不下了
//同时需要注意这里要进行清零,要不然上一阶段的数据还在可能会造成错误.
while(i < version1.size() && version1[i] != '.'){
//当还没有到末尾并且还不是小数点的时候
num1 = num1 * 10 + version1[i++] - '0';
//把位数进一位然后把该位置的数字字符转化为数字形式储存下来
}
while(j < version2.size() && version2[j] != '.'){//同理
num2 = num2 * 10 + version2[j++] - '0';
}
if(num1 > num2) return 1;//当前者比较大的时候返回1
else if(num1 < num2) return -1;//反之返回-1
i++, j++;//此处用来跳过小数点,开始下一阶段的计算
}
return 0;
}
};
新手上路,有错请指正.