Compare Version Numbers 版本号比较 C语言实现

来源:互联网 发布:linux ide 编辑:程序博客网 时间:2024/04/29 09:10

Compare two version numbers version1 and version2.
If version1 > version2 return 1, if version1 < version2 return -1, otherwise return 0.

You may assume that the version strings are non-empty and contain only digits and the . character.
The . character does not represent a decimal point and is used to separate number sequences.
For instance, 2.5 is not “two and a half” or “half way to version three”, it is the fifth second-level revision of the second first-level revision.

Here is an example of version numbers ordering:

0.1 < 1.1 < 1.2 < 13.37

题目的意思就是求两个版本号的大小比较,但给出的版本号是字符串类型的,要转换为数字进行比较
解题思路:1. 把版本号的数字转化为数组存储。 2. 利用数组进行对应大小比较。
难点:获取两个’.’之间的数字,并注意考虑开始和结束情况
在leetcode里的难度类型为easy,但我一开始还是没做出来,在参考了别人的做题思路后才做出来的,很感谢那些大神对这个题目的思路分享。
下面是我用C语言实现的代码,比较累赘:

/** * 题目的意思是比较两个版本的大小,版本大小全是以字符串的形式存储 * 解题思路:取出版本号的数字,并存储在数组中,并对两个数组进行比较 * 重点在取出版本号的数字,注意第一个数字和最后一个数字 * 字符串转数字的C函数为int num = atoi(char *); * 设置一个动态数组来存储数字 * *  * */void getInt(char *version,int size,int *ar);int compareVersion(char *version1, char *version2){    int i,count;    int *arr = NULL;    int *arr1 = NULL;    int size,size1;    int max = 0;    size = 0;    while(*(version1 + size) != '\0'){//求数组的长度        size++;    }    size1 = 0;    while(*(version2 + size1) != '\0'){        size1++;    }    if(size > size1) max = size;    else max = size1;    arr = (int *)malloc(max*sizeof(int));//分配一个动态数组    arr1 = (int *)malloc(max*sizeof(int));    memset(arr, 0 ,max*sizeof(int));//为动态分配的数组进行清空,不然里面全是垃圾数据,影响后面的赋值    memset(arr1, 0 ,max*sizeof(int));    getInt(version1, size, arr);    getInt(version2, size1, arr1);    for(i = 0; i < max; i++){//这个循环是用于比较版本号        if(*(arr + i) == *(arr1 + i)){            continue;        }else if(*(arr + i) > *(arr1 + i)){            return 1;        }else if(*(arr + i) < *(arr1 + i)){            return -1;        }    }    free(arr);//释放动态申请的数组大小,以免内存泄露    free(arr1);    return 0;}void getInt(char *version, int size, int * ar){    int i,j;    char str[255];    char *p = NULL;    int temp,temp0;    temp = 0;    temp0 = j = 0;    p = strchr(version, '.');//strchr函数用于判断字符串中是否有'.'字符,有则返回指向该字符第一次出现的指针,否则返回NULL    if(p != NULL){//这里面试读取第一个数字        memset(str, 0, 255);        strncpy(str, version, p - version);        temp0 = temp = p - version;        *(ar+j) = atoi(str);        j++;        for(i = p - version + 1; i < size; i++){//这里面是循环读取数字字符,并把它转化为整型            if(*(version + i) == '.'){                temp0 = temp;                temp = i;                memset(str, 0, 255);//这一步也是需要的,不然里面全是垃圾数据,影响后面的求值                strncpy(str, version + temp0 + 1, i - temp0 - 1);                *(ar+j) = atoi(str);                j++;            }        }        if(i == size){//这里面是读取最后一个数字字符,并转化为数字            memset(str, 0, 255);            strncpy(str, version + temp + 1, size - temp0 - 1);            *(ar+j) = atoi(str);        }    }else{//这里面是当版本version没有'.'号时,直接把version字符串转化为整型int存储        *(ar+j) = atoi(version);    }}
0 0
原创粉丝点击