题目描述:

比较两个版本号 version1 和 version2
如果 version1 version2 返回 1,如果 version1 version2 返回 -1, 除此之外返回 0

你可以假设版本字符串非空,并且只包含数字和 . 字符。

. 字符不代表小数点,而是用于分隔数字序列。

例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。

示例 1:

输入: version1 = "0.1", version2 = "1.1"
输出: -1

示例 2:

输入: version1 = "1.0.1", version2 = "1"
输出: 1

示例 3:

输入: version1 = "7.5.2.4", version2 = "7.5.3"
输出: -1

要完成的函数:

int compareVersion(string version1, string version2)

说明:

1、这道题给定两个字符串,字符串中只含有数字和'.'这个符号,这两个字符串作为版本号,要求判断哪个版本号更大。

如果第一个大于第二个,那么返回1。如果第一个小于第二个,那么返回-1。如果相等返回0。

2、这道题如果用python来做,很容易,split函数按照'.'划分,两个字符串得到多个数字存储在两个list中,把短的list在后面补0直到两个list长度相等。

接着逐个比较list中的元素,得到结论。

但是这道题笔者还是选择了c++来做,思路也是类似的,切分出多个字符串,转成数字,比较数字大小。

一直比较下去,直到两个字符串都没有数字了,或者第一个字符串有数字、第二个字符串没有数字,或者第二个字符串有数字、第一个字符串没有数字

如果是第一种情况,那么返回0。

如果是第二种情况,我们来看多个例子:

①1.1.2和1.1,那么这个时候第三个数字2大于0,那么返回1。

②1.1.0和1.1,那么第三个数字为0,后面没有数字,那么返回0。

③1.1.0.1和1.1,那么第三个数字为0,继续比较下去,第四个数字为1>0,那么返回1。

如果是第三种情况,同样有多个例子,跟第二种情况类似。

所以我们可以构造出如下代码:(略长,附详解)

    int str2int(string i)//把字符串转为数字,返回得到的数字
{
int res=0;
for(int j=0;j<i.size();j++)
res=10*res+i[j]-'0';
return res;
}
int compareVersion(string version1, string version2)//要完成的子函数
{
if(version1==version2)// 如果相等,直接返回
return 0;
int i=0,j=0,s1=version1.size(),s2=version2.size(),start1=0,start2=0,result1,result2;
while(start1<s1||start2<s2)//start1表示第一个字符串中当前数字从哪里开始,start2同理
{//只要有一个字符串还有数字,那么就继续比较下去
if(start1<s1&&start2<s2)//如果两个字符串都有数字
{
while(i<s1)//i记录'.'的位置,或者到达字符串最末端i=version1.size()
{
if(version1[i]=='.')
break;
i++;
}
while(j<s2)//j同理,记录'.'的位置或者version2.size()
{
if(version2[j]=='.')
break;
j++;
}
result1=str2int(version1.substr(start1,i-start1));//取出当前子字符串,转化为数字,存储在result1中
result2=str2int(version2.substr(start2,j-start2));//取出当前子字符串,转化为数字,存储在result2中
if(result1>result2)//如果第一个大于第二个,那么返回1
return 1;
else if(result1<result2)//如果第一个小于第二个,那么返回-1
return -1;
else//如果当前这两个数字相等,那么继续比较下去
{
start1=i+1;//更新start1的值
i=start1;//更新i的值
start2=j+1;//更新start2的值
j=start2;//更新j的值
}
}
else if(start1<s1)//如果只有第一个字符串还有数字
{
while(i<s1)
{
if(version1[i]=='.')
break;
i++;
}
result1=str2int(version1.substr(start1,i-start1));
if(result1>0)//如果大于0,那么立马返回1,不用再比较了
return 1;
else//如果等于0,那么继续比较下去
{
start1=i+1;
i=start1;
}
}
else if(start2<s2)//如果只有第二个字符串有数字
{
while(j<s2)
{
if(version2[j]=='.')
break;
j++;
}
result2=str2int(version2.substr(start2,j-start2));
if(result2>0)//如果大于0,那么停止比较,返回-1
return -1;
else//如果等于0,那么继续比较下去
{
start2=j+1;
j=start2;
}
}
}
return 0;//如果两个字符串都跑完了,都没有比较出结果来,那么这时候必然两个字符串的版本号相等
}

上述代码实测0ms,beats 100.00% of cpp submissions。

leetcode-165-比较版本号的更多相关文章

  1. Java实现 LeetCode 165 比较版本号

    165. 比较版本号 比较两个版本号 version1 和 version2. 如果 version1 > version2 返回 1,如果 version1 < version2 返回 ...

  2. leetcode 165

    才一周没刷leetcode,手就生了,这个题目不难,但是完全AC还是挺费劲的. 题目描述: Compare two version numbers version1 and version2.If v ...

  3. Leetcode 165 Compare Version Numbers

    题意:比较版本号的大小 有点变态,容易犯错 本质是字符串的比较,请注意他的版本号的小数点不知1个,有的会出现01.0.01这样的变态版本号 class Solution { public: int c ...

  4. [LeetCode] 165. Compare Version Numbers 比较版本数

    Compare two version numbers version1 and version1.If version1 > version2 return 1, if version1 &l ...

  5. ✡ leetcode 165. Compare Version Numbers 比较两个字符串数字的大小 --------- java

    Compare two version numbers version1 and version2.If version1 > version2 return 1, if version1 &l ...

  6. Java for LeetCode 165 Compare Version Numbers

    Compare two version numbers version1 and version2.If version1 > version2 return 1, if version1 &l ...

  7. Java [Leetcode 165]Compare Version Numbers

    题目描述: Compare two version numbers version1 and version2.If version1 > version2 return 1, if versi ...

  8. leetcode题库

    leetcode题库 #题名题解通过率难度出现频率  1 两数之和     46.5%简单2 两数相加     35.5%中等3 无重复字符的最长子串     31.1%中等4 寻找两个有序数组的中位 ...

  9. C#LeetCode刷题-字符串

    字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串   24.6% 中等 5 最长回文子串   22.4% 中等 6 Z字形变换   35.8% 中等 8 字符串转整数 (atoi)   ...

  10. LeetCode刷题 字符串详解

    一.字符串常用的操作 1. string类 1.1 string的定义与初始化 1.1.1 string的定义 1.1.2 string的初始化 1.2 string的赋值与swap.大小操作.关系运 ...

随机推荐

  1. C++ 动态分配 和 内存分配和内存释放

    动态分配 动态分配可以说是指针的关键所在.不需要通过定义变量,就可以将指针指向分配的内存.也许这个概念看起来比较模糊,但是确实比较简单.下面的代码示范如何为一个整数分配内存: int *pNumber ...

  2. scala单元测试,包括功能测试和性能测试

    十分简单的scala单元测试 在编写性能要求高的模块的时候,单元测试是有必要的,通过搜索,我找到了一套提供单元功能测试和性能测试的可行方案,该方案简单好用,推荐给大家. 测试工具 首先找到适用于sca ...

  3. spring @Transactional 声明式事务

    项目地址:git@github.com:witaste/transaction-annotation.git 情景一: A external method calls a method of the ...

  4. 都有哪些 cache ?

    1. spring http://www.springframework.org/schema/cache 2. ehcache LOGO关键词:palindrome [ˈpælɪndrəʊm] 正读 ...

  5. 3) Maven 目录结构

    进入maven根目录 cmd 命令 tree E:. │ LICENSE.txt │ NOTICE.txt │ README.txt │ ├─bin │ m2.conf │ mvn │ mvn.bat ...

  6. Win窗口坐标二维坐标与OpenGl的世界坐标系的之间的相互转换

    Win窗口坐标二维坐标与OpenGl的世界坐标系的转换 几何处理管线擅长于使用视图和投影矩阵以及用于裁剪的视口把顶点的世界坐标变换为窗口坐标. 但是,在有些情况下,需要逆转这个过程.一种常见的情形是: ...

  7. lock wait timeout exceeded; try restarting transactio解决方案

    问题原因:       今天线上环境,突然出现一个问题,追踪原因是数据库中的一条语句报错,错误内容:lock wait timeout exceeded; try restarting transac ...

  8. POJ2653判断线段相交

    POJ2653 题目大意:按顺序放木棒,问最后所有的木棒中上面没有木棒的木棒的索引是…… 思路:按理说线段相交的题目做的听多了,这个应该不算新鲜,但是这个题,还是让我学到了认真读题,面对这个题很容易想 ...

  9. Bellman_ford货币兑换——正权回路判断

    POJ1860 题目大意:你在某一点有一些钱,给定你两点之间钱得兑换规则,问你有没有办法使你手里的钱增多.就是想看看转一圈我的钱能不能增多,出现这一点得条件就是有兑换钱得正权回路,所以选择用bellm ...

  10. springMVC 开涛 数据绑定

    纸上得来终觉浅,绝知此事要躬行. 一.@requestParam //使用方法URL:?username="sfp" test(@RequestParam(value=" ...