leetcode刷题笔记一百六十五题 比较版本号
源地址:165. 比较版本号
问题描述:
较两个版本号 version1 和 version2。
如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0。你可以假设版本字符串非空,并且只包含数字和 . 字符。
. 字符不代表小数点,而是用于分隔数字序列。
例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。
你可以假设版本号的每一级的默认修订版号为 0。例如,版本号 3.4 的第一级(大版本)和第二级(小版本)修订号分别为 3 和 4。其第三级和第四级修订号均为 0。
示例 1:
输入: version1 = "0.1", version2 = "1.1"
输出: -1
示例 2:输入: version1 = "1.0.1", version2 = "1"
输出: 1
示例 3:输入: version1 = "7.5.2.4", version2 = "7.5.3"
输出: -1
示例 4:输入:version1 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,“01” 和 “001” 表示相同的数字 “1”。
示例 5:输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 没有第三级修订号,这意味着它的第三级修订号默认为 “0”。提示:
版本字符串由以点 (.) 分隔的数字字符串组成。这个数字字符串可能有前导零。
版本字符串不以点开始或结束,并且其中不会有两个连续的点。
//常见思路 使用封装API对字符串进行split 比较每层的版本号是否一致
object Solution {
def compareVersion(version1: String, version2: String): Int = {
val arrStr1 = version1.split('.')
val arrStr2 = version2.split('.')
val lenStr1 = arrStr1.length
val lenStr2 = arrStr2.length
//边界条件处理
if (lenStr1 == 1 && lenStr2 == 0) return 1
if (lenStr1 == 0 && lenStr2 == 1) return -1
for (i <- 0 to Math.max(lenStr1, lenStr2)-1){
val str1 = {
if (i < lenStr1) arrStr1(i).toInt
else 0
}
val str2 = {
if (i < lenStr2) arrStr2(i).toInt
else 0
}
if (str1 > str2) return 1
if (str1 < str2) return -1
}
return 0
}
}
//双指针法 计算每层的版本号进行比较
//对于'.'跳过, 对层内数字进行求和比较
object Solution {
def compareVersion(version1: String, version2: String): Int = {
val ver1Len = version1.length
val ver2Len = version2.length
var ver1Cur = 0
var ver2Cur = 0
while (ver1Cur < ver1Len || ver2Cur < ver2Len) {
if (ver1Cur < ver1Len && version1.charAt(ver1Cur) == '.') ver1Cur += 1
if (ver2Cur < ver2Len && version2.charAt(ver2Cur) == '.') ver2Cur += 1
var acc1 = 0
var acc2 = 0
while (ver1Cur < ver1Len && version1.charAt(ver1Cur)!= '.') {
acc1 += acc1 * 10 + version1.charAt(ver1Cur) - '0'
ver1Cur += 1
}
while (ver2Cur < ver2Len && version2.charAt(ver2Cur)!= '.') {
acc2 += acc2 * 10 + version2.charAt(ver2Cur) - '0'
ver2Cur += 1
}
if (acc1 < acc2) return -1
if (acc1 > acc2) return 1
}
return 0
}
}