leetcode-165-比较版本号
题目描述:
比较两个版本号 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-比较版本号的更多相关文章
- Java实现 LeetCode 165 比较版本号
165. 比较版本号 比较两个版本号 version1 和 version2. 如果 version1 > version2 返回 1,如果 version1 < version2 返回 ...
- leetcode 165
才一周没刷leetcode,手就生了,这个题目不难,但是完全AC还是挺费劲的. 题目描述: Compare two version numbers version1 and version2.If v ...
- Leetcode 165 Compare Version Numbers
题意:比较版本号的大小 有点变态,容易犯错 本质是字符串的比较,请注意他的版本号的小数点不知1个,有的会出现01.0.01这样的变态版本号 class Solution { public: int c ...
- [LeetCode] 165. Compare Version Numbers 比较版本数
Compare two version numbers version1 and version1.If version1 > version2 return 1, if version1 &l ...
- ✡ leetcode 165. Compare Version Numbers 比较两个字符串数字的大小 --------- java
Compare two version numbers version1 and version2.If version1 > version2 return 1, if version1 &l ...
- Java for LeetCode 165 Compare Version Numbers
Compare two version numbers version1 and version2.If version1 > version2 return 1, if version1 &l ...
- Java [Leetcode 165]Compare Version Numbers
题目描述: Compare two version numbers version1 and version2.If version1 > version2 return 1, if versi ...
- leetcode题库
leetcode题库 #题名题解通过率难度出现频率 1 两数之和 46.5%简单2 两数相加 35.5%中等3 无重复字符的最长子串 31.1%中等4 寻找两个有序数组的中位 ...
- C#LeetCode刷题-字符串
字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.6% 中等 5 最长回文子串 22.4% 中等 6 Z字形变换 35.8% 中等 8 字符串转整数 (atoi) ...
- LeetCode刷题 字符串详解
一.字符串常用的操作 1. string类 1.1 string的定义与初始化 1.1.1 string的定义 1.1.2 string的初始化 1.2 string的赋值与swap.大小操作.关系运 ...
随机推荐
- SQA计划和系统测试规程
SQA计划和系统测试规程 一.SQA计划 1.软件工程 我们小组所做的项目是图书馆管理系统.我们要准确的了解此软件的需求(能够注册登录,查询图书,借书,还书,查看借阅记录等),在此前提进行建模,基于场 ...
- 2018.10.14 NOIP训练 猜数游戏(决策单调性优化dp)
传送门 一道神奇的dp题. 这题的决策单调性优化跟普通的不同. 首先发现这道题只跟r−lr-lr−l有关. 然后定义状态f[i][j]f[i][j]f[i][j]表示猜范围为[L,L+i−1][L,L ...
- 2018.09.23 孙悟空大战鲤鱼精(单调队列优化dp)
描述 孙悟空大战鲤鱼精,孙悟空在通天河遇到鲤鱼精,他嫉恶如仇,看见妖精就手痒(忘了自己是妖精).但是鲤鱼精知道孙悟空的厉害,在孙悟空来到通天河,鲤鱼精就跑到了河对面.于是孙悟空就去追鲤鱼精. 我们可以 ...
- Codeforces805D. Minimum number of steps 2017-05-05 08:46 240人阅读 评论(0) 收藏
D. Minimum number of steps time limit per test 1 second memory limit per test 256 megabytes input st ...
- IDEA14/Eclipse+Tomcat7热部署,jrebel6破解与eclipse配置
换了最新的eclipse,以前很多的插件都用不了,对于web开发的人来说,jrebel这种防重启神器必须要配备,防止修改类名.java文件.配置文件后的tomcat重启. 首先给一个下载地址: htt ...
- 老刘 Yii2 源码学习笔记之 Module 类
关系类图 从上图可以看出 Application 类继承了 Module,在框架中的是非常重要角色. 加载配置 public function setModules($modules) { forea ...
- node 命令行
问题起源于,想用node执行命令行的命令. 结论如下:两种情况 1.node本身的命令(node app.js):使用child_process模块的四个方法 2.命令行的命令(包括1,还有java) ...
- 移动端与PC端的viewport
第一种解析: 设备像素,就是我们直觉上觉得"靠谱"的像素,这些像素为所使用的各种设备提供了正规的分辨率,并且其值可以通过(通常情况下)从screen.width/height属性中 ...
- Android-ColorsUtil工具类
颜色工具类 public class ColorsUtil { private ColorsUtil() { throw new Error("Do not need instantiate ...
- ActiveMq 配置多队列
一直在赶项目,好久没有写博文了,中间偶尔有些代码什么的,也都是放到github了,不过大多都是测试代码,毕竟有些成型的东西是给公司写的,鉴于职业道德,还是不好公开. 言归正传,这两天在接入第三方的收费 ...