首页 > 试题广场 >

比较版本号

[编程题]比较版本号
  • 热度指数:113337 时间限制: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          
from types import coroutine
from itertools import count

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 比较版本号
# @param version1 string字符串
# @param version2 string字符串
# @return int整型
#
class Solution:
    def compare(self, version1: str, version2: str) -> int:
        # write code here
        v1 = version1.split(".")
        v2 = version2.split(".")
        maxn = max(len(v1), len(v2))
        minn = min(len(v1), len(v2))
        for i in range(0, maxn):
            if i <= minn-1:
                if int(v1[i]) > int(v2[i]):
                    return 1
                elif int(v1[i]) < int(v2[i]):
                    return -1
            else:
                if len(v1) > len(v2) and int(v1[i]) > 0:
                    return 1
                if len(v1) < len(v2) and int(v2[i]) > 0:
                    return -1
        return 0

发表于 2024-11-08 17:39:11 回复(0)
class Solution:
    def compare(self , version1: str, version2: str) -> int:
        # write code here
        str1list=version1.split(".")
        str2list=version2.split(".")
        if len(str1list)>len(str2list):
            chazhi=len(str1list)-len(str2list)
            for i in range(chazhi):
                str2list.append("0")
        if len(str1list)<len(str2list):
            chazhi=len(str2list)-len(str1list)
            for i in range(chazhi):
                str1list.append("0")
        for i in range (len(str1list)):
            if int(str1list[i]) > int(str2list[i]):
                return 1
            if int(str1list[i]) < int(str2list[i]):
                return -1
        return 0
发表于 2024-07-02 17:32:35 回复(0)
1. 将两个版本号根据“.”分割成数组
2. 从左至右比较两个数组元素,如果数组下标没有超出则比较每个元素的大小,如果超出某个数组下标,则补上0继续比较。
class Solution:
def compareVersion(self, version1: str, version2: str) -> int:
v1 = version1.split(".")
v2 = version2.split(".")

l1, l2 = len(v1), len(v2)

for i in range(max(l1, l2)):
n1 = 0 if i >= l1 else int(v1[i])
n2 = 0 if i >= l2 else int(v2[i])

if n1 < n2:
return -1
elif n1 > n2:
return 1
return 0
发表于 2024-05-15 12:44:30 回复(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号
难度:
10条回答 12824浏览

热门推荐

通过挑战的用户

查看代码
比较版本号