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

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);
    }
}

你可能感兴趣的:(leetcode)