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);
}
}
本文介绍了如何使用C语言比较两个版本号。版本号由数字和'.'组成,需将其转换为数组并按顺序比较。文章中作者分享了解题思路和代码实现,包括将版本号拆分为数字、进行数组比较的难点,以及在LeetCode上解决此问题的经历。
1666

被折叠的 条评论
为什么被折叠?



