首页 > 试题广场 >

比较版本号

[编程题]比较版本号
  • 热度指数:113276 时间限制: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          
#include <stdio.h>
int VersionChange(char *version, int *IntVersion) {
    int i=0,j=0;
    while(i<strlen(version)) {
        if(version[i]=='.') 
            j++;
        else {
            IntVersion[j]*=10;
            IntVersion[j]+=version[i]-'0';
        }
        i++;
    }
    return j+1;
}
int compare(char* version1, char* version2 ) {
    int IntVersion1[1000]={0},IntVersion2[1000]={0}, IntVersionLen1, IntVersionLen2, i=0;
    IntVersionLen1=VersionChange(version1, IntVersion1);
    IntVersionLen2=VersionChange(version2, IntVersion2);
    while(i< (IntVersionLen1>IntVersionLen2?IntVersionLen1:IntVersionLen2)) {
        if(IntVersion1[i]>IntVersion2[i]) 
            return 1;
        else if(IntVersion1[i]<IntVersion2[i]) 
            return -1;
        
        i++;
    }
    return 0;
}

编辑于 2024-03-16 13:27:33 回复(0)
略复杂
思路就是扫一遍过去每个修订号对比一下

int compare(char* version1, char* version2 ) {
    int v1,v2;
    int i,j;  
    v1 = 0;
    v2 = 0;
    i = 0;
    j = 0;
    while(version1[i]!='\0'||version2[j]!='\0'){
        if((version1[i]=='.'||version1[i]=='\0')&&(version2[j]=='.'||version2[j]=='\0')){
            if(v1 > v2){
                return 1;
            }else if(v1 < v2){
                return -1;
            }else{
                v1 = 0;
                v2 = 0;
                if(version1[i]!='\0'){
                    i++;
                }
                if(version2[j]!='\0'){
                    j++;
                }
            }
        }
        if(version1[i]!='\0'&&version1[i]!='.'){
            v1 = v1*10;
            v1 += version1[i]-'0';
            i++;
        }
        if(version2[j]!='\0'&&version2[j]!='.'){
            v2 = v2*10;
            v2 += version2[j] - '0';
            j++;
        }
    }
    if(v1>v2){
        return 1;
    }else if(v1<v2){
        return -1;
    }

    return 0;
}

发表于 2023-09-21 14:27:52 回复(0)
int compare(char* version1, char* version2 ) 
{
    int num1=0,num2=0;
    while(*version1 != 0 || *version2 != 0)
    {
        while(*version1 != '.' && *version1 != 0)
        {
            num1 = num1*10+*version1 - '0';
            version1++;
        }
        while(*version2 != '.' && *version2 != 0)
        {
            num2 = num2*10+*version2 - '0';
            version2++;
        }
        if(num1 > num2)
        {
            return 1;
        }
        else if(num1 < num2)
        {
            return -1;
        }
        if(*version1 != 0)
        version1++;
        if(*version2 != 0)
        version2++;
        num1 = 0;
        num2 = 0;
    }
    return 0;
    // write code here
}

发表于 2022-11-05 17:03:36 回复(1)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 比较版本号
 * @param version1 string字符串
 * @param version2 string字符串
 * @return int整型
 */
int compare(char* version1, char* version2 ) {
    // write code here

    char* p1 = version1;
    char* p2 = version2;
    char buf1[128] = {0}, buf2[128] = {0};
    int pos1 = 0, pos2 = 0;
    int val1 = 0, val2 = 0;
    while (*p1 != '\0' && *p2 != '\0') {
        int rtn1 = sscanf(p1, "%[^.].%n", buf1, &pos1);
        int rtn2 = sscanf(p2, "%[^.].%n", buf2, &pos2);

        if (rtn1 != 1 && rtn2 != 1)
            break;

        val1 = atoi(buf1);
        val2 = atoi(buf2);

        if (pos1 == 0)
            val1 = 0;

        if (pos2 == 0)
            val2 = 0;

        if (val1 > val2)
            return 1;
        else if (val1 < val2)
            return -1;

        //相等继续比较
        memset(buf1, 0x00, sizeof(buf1));
        memset(buf2, 0x00, sizeof(buf2));
        p1 += pos1;
        p2 += pos2;

    }


    return 0;
}


发表于 2022-09-25 01:44:39 回复(0)
int compare(char* version1, char* version2 ) {
    // write code here
    int n1=0,n2=0;
    int len1=strlen(version1);
    int len2=strlen(version2);
    for(int i=0,j=0;1;)
    {
        if(version1[i]<='9'&&version1[i]>='0')
        {
            n1=n1*10+(version1[i]-'0');
            i++;
        }
         if(version2[j]<='9'&&version2[j]>='0')
        {
            n2=n2*10+(version2[j]-'0');
             j++;
        }
        if(((version1[i]=='.')&&(version2[j]=='.'))||((version1[i]=='.')&&(version2[j]=='\0'))
           ||((version1[i]=='\0')&&(version2[j]=='.')))
        {
            if (n1>n2) return 1;
            else if(n2>n1) return -1;
            if(i<len1) i++;
            if(j<len2) j++;
            n1=0;n2=0;
        }
        if((version1[i]=='\0')&&(version2[j]=='\0'))
        {
            if (n1>n2) return 1;
            else if(n2>n1) return -1;
            else return 0;
        }
    }
}

发表于 2022-09-01 10:25:07 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 比较版本号
 * @param version1 string字符串 
 * @param version2 string字符串 
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int compare(char* version1, char* version2 ) {
    // write code here
    int a,b,x=0,y=0,i,s1=0,s2=0,h;
    int val1=0,val2=0;
    a=strlen(version1);
    b=strlen(version2);
    printf("%d %d\n",a,b);
    U:
    s1=x;
    for(i=s1;i<a;i++)
    {
        if(version1[i]=='.')
        {
            x=i+1;
            h=0;
            break;
        }
        h=1;
        x=a;
    }
    if(h==0)
    {
        for(i=s1;i<x-1;i++)
        {
            val1=10*val1+(version1[i]-'0');
        }
    }
    if(h==1)
    {
       for(i=s1;i<x;i++)
        {
            val1=10*val1+(version1[i]-'0');
        } 
    }
    //--------------------------------------------------
    s2=y;
    for(i=s2;i<b;i++)
    {
        if(version2[i]=='.')
        {
            y=i+1;
            h=0;
            break;
        }
        h=1;
        y=b;
    }
   if(h==0)
    {
        for(i=s2;i<y-1;i++)
        {
            val2=10*val2+(version2[i]-'0');
        }
    }
    if(h==1)
    {
       for(i=s2;i<y;i++)
        {
            val2=10*val2+(version2[i]-'0');
        } 
    }
    //-----------------------------------------------------------
    puts("------------------------");
    printf("x : %d y : %d\n",x,y);
    printf("val1 : %d val2 : %d\n",val1,val2);
    printf("s1 : %d s2 : %d\n",s1,s2);
    puts("------------------------");
    if(val1>val2)
    {
        return 1;
    }
    if(val1<val2)
    {
        return -1;
    }
   if(val1==val2)
   {
       
       if(x==a&&y==b)
       {
           return 0;
       }
       else if(x==a)
       {
           for(i=s2+y;i<b;i++)
           {
              if(version2[i]-'0'>0)
              {
                  return -1;
              }
           }
           return 0;
       }
       else if(y==b)
       {
           for(i=s1+x;i<a;i++)
           {
              if(version1[i]-'0'>0)
              {
                  return 1;
              }
           }
           return 0;
       }
       else
       {
           val1=0;
           val2=0;
           goto U;
       }
   }
    return 5;
}
发表于 2022-08-28 14:19:11 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 比较版本号
 * @param version1 string字符串 
 * @param version2 string字符串 
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */

int compare(char* version1, char* version2 ) {
    // write code here
    char *buf1 = version1;
    char *buf2 = version2;
    char *p1=NULL;
    char *p2=NULL;

    p1 = strtok_r(version1,".",&buf1);
    p2 = strtok_r(version2,".",&buf2);   
    while(p1 && p2){
        if(atoi(p1) > atoi(p2)) {
            return 1;
        } else if(atoi(p1) < atoi(p2)) 
            return -1;
         p1 = strtok_r(NULL,".",&buf1);
         p2 = strtok_r(NULL,".",&buf2);           
    }
    if(p1 == NULL && p2 == NULL)
        return 0;
    while(p1 ) {
        if(atoi(p1) > 0)
            return 1;
         p1 = strtok_r(NULL,".",&buf1);
    }
    while(p2) { 
        if(atoi(p2) > 0)
            return -1;
        p2 = strtok_r(NULL,".",&buf2);
    }
       return 0;
}
发表于 2022-04-10 15:20:25 回复(0)
int compare(char* version1, char* version2) {
    // write code here
    int number1 = 0, number2 = 0;

    while (*version1 && *version2) {
        while (*version1 && *version1 != '.') {
            number1 = number1 * 10 + (*version1++ - '0');
        }
        while (*version2 && *version2 != '.') {
            number2 = number2 * 10 + (*version2++ - '0');
        }
        if (number1 == number2) {
            version1 = (*version1 == '.' ? version1 + 1 : version1);
            version2 = (*version2 == '.' ? version2 + 1 : version2);
            number1 = number2 = 0;
            continue;
        }
        return number1 > number2 ? 1 : -1;
    }
    if (*version1 == *version2) {
        return 0;
    }
    while (*version1) {
        if (*version1 == '.') {
            if (number1 == 0) {
                version1++;
                continue;
            } else {
                break;
            }
        }
        number1 = number1 * 10 + (*version1++ - '0');
    }
    while (*version2) {
        if (*version2 == '.') {
            if (number2 == 0) {
                version2++;
                continue;
            } else {
                break;
            }
        }
        number2 = number2 * 10 + (*version2++ - '0');
    }

    return number1 == number2 ? 0 : (number1 > number2 ? 1 : -1);
}

发表于 2022-03-28 17:17:23 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 比较版本号
 * @param version1 string字符串 
 * @param version2 string字符串 
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
//因为需要比较的修改号可能会很长,因此没有选用转化为数字来比较的方法,而是逐个字符进行比较
int compare(char* version1, char* version2 ) {
    // write code here
    int prelen1 = 0, prelen2 = 0, suclen1 = 0, suclen2 = 0;//每一个需要比较的修改号在字符串中的开始位置和结束位置
    int i ,j;
    while(1)//(*(version1 + suclen1) != '\0' && *(version2 + suclen2) != '\0')
    {
        //如果遇到了一个修改号结束的位置‘\0’‘.’,则开始比较当前的两个修改号
        if((*(version1 + suclen1) == '.' || *(version1 + suclen1) == '\0' )&& (*(version2 + suclen2) == '.' || *(version2 + suclen2) == '\0') )
        {
            if(suclen1 -prelen1 > suclen2 - prelen2)
            {
                return 1;
            }
            else if(suclen1 -prelen1 < suclen2 - prelen2)
            {
                return -1;
            }
            else
            {
                i = suclen1 - 1;
                j = suclen2 - 1;
                while(i >= prelen1 && j >= prelen2)
                {
                    if(*(version1 + i) > *(version2 + j))
                    {
                        return 1;
                    }
                    else if(*(version1 + i) < *(version2 + j))
                    {
                        return -1;
                    }
                    else
                    {
                        i --;
                        j --;
                    }
                }
                if( *(version1 + suclen1) == '\0' || *(version2 + suclen2) == '\0')
                {
                    break;
                }
                suclen1 ++;
                suclen2 ++;
                prelen1 = suclen1;
                prelen2 = suclen2;
            }
        }
        //不用比较继续向前走
        if((*(version1 + suclen1) != '.') && (*(version1 + suclen1) != '\0'))
        {
            //处理前面的0
            if((*(version1 + suclen1) == '0') && (prelen1 == suclen1))
            {
                prelen1 ++;
            }
            suclen1 ++;
        }
        //不用比较继续向前走
        if((*(version2 + suclen2) != '.') && (*(version2 + suclen2) != '\0'))
        {
            //处理前面的0
            if((*(version2 + suclen2) == '0') && (prelen2 == suclen2))
            {
                prelen2 ++;
            }
            suclen2 ++;
        }
    }
    if( *(version1 + suclen1) == '\0')
    {
        while(*(version2 + suclen2) != '\0')
        {
            if((*(version2 + suclen2) > '0') && (*(version2 + suclen2) <= '9') )
            {
                return -1;
            }
            suclen2 ++;
        }
    }
    if( *(version2 + suclen2) == '\0')
    {
        while(*(version1 + suclen1) != '\0')
        {
            if(((*(version1 + suclen1) > '0') && (*(version1 + suclen1 )<= '9') ))
            {
                return 1;
            }
               suclen1 ++;
        }
    }
    return 0;
} 

发表于 2022-03-02 20:35:34 回复(0)