首页 > 试题广场 >

比较版本号

[编程题]比较版本号
  • 热度指数:100212 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
牛客项目发布项目版本时会有版本号,比如1.02.11,2.14.4等等
现在给你2个版本号version1和version2,请你比较他们的大小
版本号是由修订号组成,修订号与修订号之间由一个"."连接。1个修订号可能有多位数字组成,修订号可能包含前导0,且是合法的。例如,1.02.11,0.1,0.2都是合法的版本号
每个版本号至少包含1个修订号。
修订号从左到右编号,下标从0开始,最左边的修订号下标为0,下一个修订号下标为1,以此类推。

比较规则:
一. 比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较忽略任何前导零后的整数值。比如"0.1"和"0.01"的版本号是相等的
二. 如果版本号没有指定某个下标处的修订号,则该修订号视为0。例如,"1.1"的版本号小于"1.1.1"。因为"1.1"的版本号相当于"1.1.0",第3位修订号的下标为0,小于1
三.  version1 > version2 返回1,如果 version1 < version2 返回-1,不然返回0.

数据范围:
version1 和 version2 的修订号不会超过int的表达范围,即不超过 32 位整数 的范围

进阶: 空间复杂度 , 时间复杂度
示例1

输入

"1.1","2.1"

输出

-1

说明

version1 中下标为 0 的修订号是 "1",version2 中下标为 0 的修订号是 "2" 。1 < 2,所以 version1 < version2,返回-1
示例2

输入

"1.1","1.01"

输出

0

说明

version2忽略前导0,为"1.1",和version相同,返回0          
示例3

输入

"1.1","1.1.1"

输出

-1

说明

"1.1"的版本号小于"1.1.1"。因为"1.1"的版本号相当于"1.1.0",第3位修订号的下标为0,小于1,所以version1 < version2,返回-1          
示例4

输入

"2.0.1","2"

输出

1

说明

version1的下标2>version2的下标2,返回1          
示例5

输入

"0.226","0.36"

输出

1

说明

226>36,version1的下标2>version2的下标2,返回1          
class Solution:
    def compare(self , version1: str, version2: str) -> int:
        # write code here
        #两个字符串列表化,同时将元素化为整形
        x=version1.split('.')
        y=version2.split('.')
        x=[int(a) for a in x]
        y=[int(b) for b in y]
        #初始化循环的结束条件
        z=min(len(x),len(y))
        #初始化两个列表的初始索引为0
        ct=0
        #通过循环对两个列表的元素进行比较
        while ct<z:
            if x[ct]>y[ct]:
                return 1
            elif x[ct]<y[ct]:
                return -1
            #两个列表的同索引元素相等时,索引加一,继续循环
            else:ct+=1
        #循环结束仍未输出结果继续对列表长度进行判断
        else:
            #长度相等则两个版本号等价
            if len(x)==len(y):
                return 0
            #长度不等且更长的列表超出的元素相加不为零,则更长的版本号更大
            elif len(x)>len(y) and sum(x[len(y):])!=0:
                return 1
            elif len(x)<len(y) and sum(y[len(x):])!=0:
                return -1
            #存在长度不等,但超出部分的元素相加为零,实则两个版本号等价
            else:return 0
发表于 2024-04-09 11:27:28 回复(0)
def compare(self , version1: str, version2: str) -> int:
        version1 = version1.rstrip('.0')
        version2 = version2.rstrip('.0')
        list1 = version1.split('.')
        list2 = version2.split('.')
        ret = 0
        for index in range(len(list1)):
            num1 = list1[index]
            if index >= len(list2):
                ret = 1
                break
            num2 = list2[index]
            if num1== num2:
                continue
            if int(num1) > int(num2):
                ret = 1
                break
            elif int(num1) == int(num2):
                continue
            ret = -1
            break
        if ret == 0:
            if len(list1) < len(list2):
                ret = -1
        return ret 


发表于 2023-10-16 15:42:57 回复(0)
class Solution:
    def compare(self , version1: str, version2: str) -> int:
        # write code here
        ver1 = version1.split('.')
        ver2 = version2.split('.')
        n1, n2 = len(ver1), len(ver2)
        
        for i in range(max(n1, n2)):
            num1 = int(ver1[i]) if i < n1 else 0
            num2 = int(ver2[i]) if i < n2 else 0
            
            if num1 > num2:
                return 1
            elif num1 < num2:
                return -1
        
        return 0

发表于 2023-10-16 09:53:26 回复(0)
class Solution:
    def compare(self , version1: str, version2: str) -> int:
        version1_SP = version1.split('.')
        version2_SP = version2.split('.')
        while len(version1_SP)<len(version2_SP):
            version1_SP.append(0)
        while len(version1_SP)>len(version2_SP):
            version2_SP.append(0)

        for ii in range(len(version2_SP)):
            if int(version1_SP[ii])<int(version2_SP[ii]):
                return -1
            elif int(version1_SP[ii])>int(version2_SP[ii]):
                return 1
        return 0

发表于 2023-03-01 09:58:32 回复(0)

时间复杂度:O(n) 空间复杂度O(1)

class Solution:
    def compare(self , version1: str, version2: str) -> int:
        v1 = list(map(int, version1.split('.')))       
        v2 = list(map(int, version2.split('.')))
        if len(v1) > len(v2):
            v2.extend([0 for i in range(len(v1) - len(v2))])
        elif len(v1) < len(v2):
            v1.extend([0 for i in range(len(v2) - len(v1))])
        for i in range(len(v1)):
            if v1[i] > v2[i]:
                return 1
            elif v1[i] < v2[i]:
                return -1
        return 0

class Solution:
    def compare(self , version1: str, version2: str) -> int:
        n1 = len(version1)
        n2 = len(version2)
        i, j = 0, 0
        while i < n1 or j < n2:
            num1 = 0
            while i < n1 and version1[i] != '.':
                num1 = num1 * 10 + int(version1[i])
                i += 1
            i += 1
            num2 = 0
            while j < n2 and version2[j] != '.':
                num2 = num2 * 10 + int(version2[j])
                j += 1
            j += 1
            if num1 < num2:
                return -1
            elif num1 > num2:
                return 1
        return 0
发表于 2022-05-16 16:24:49 回复(0)
class Solution:
    def compare(self , version1: str, version2: str) -> int:
        # write code here
        v1 = version1.split('.')
        v2 = version2.split('.')
        if len(v1) <= len(v2):
            res = self.c(v1, v2)
        elif len(v1) > len(v2):
            res = - self.c(v2, v1)
        return res
    def c(self, a, b):
        for e, i in enumerate(a):
            if int(i) > int(b[e]):
                return 1
            elif int(i) < int(b[e]):
                return -1
        for j in b[e + 1:]:
            if int(j) != 0:
                return -1
        return 0


发表于 2021-12-21 17:00:55 回复(0)

问题信息

上传者:牛客332641号
难度:
7条回答 11666浏览

热门推荐

通过挑战的用户

查看代码