LeetCode 165: Compare Version Numbers

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

Credits:
Special thanks to @ts for adding this problem and creating all test cases.


分析,题目要求比较Version Number,按题目给出的示例,将Version分为Main Version和Sub Version,如"0.1" Main version为0, SubVersion为1。很容易根据 ” “将字符串”0.1“分为 Main和Sub两个部分。得到如下的代码:

class Solution {
public:
   	int getMainVersion(string version){
		int index = version.find(".");
		string substr;
		if (index == -1)
		{
			substr = version;
		}
		substr = version.substr(0, index);
		return atoi(substr.c_str());
	}
	int getSubVersion(string version){
		int index = version.find(".");
		string substr;
		if (index == -1)
		{
			return 0;
		}
		substr = version.substr(index+1, version.size()-index);
		return atoi(substr.c_str());
	}
       int compareVersion(string version1, string version2){
		int mainVersion1 =getMainVersion(version1);
		
		int mainVersion2 = getMainVersion(version2);
		
		if (mainVersion1 != mainVersion2)
		{
			return (mainVersion1 > mainVersion2) ? 1: -1;
		}
		int subVersion1 = getSubVersion(version1);
		int subVersion2 = getSubVersion(version2);
		if (subVersion1 != subVersion2)
		{
			return (subVersion1 > subVersion2) ? 1: -1;
		}
		return 0;
	}
};

很不幸,提交失败,题目的测试用例并不是只有主、从版本号。还有”10.6.5“这样的3段版本号。

所以需要设置一个数组,用于保存版本号各段信息,分离版本号的方法有点类似于Java中的Split方法。

得到要比较的两个版本字符串对应的版本号数组后,将两个版本号数组通过添加0对齐,然后再按位比较。

代码如下:

class Solution {
public:
    //通过.号分隔字符串得到版本号数组,如”0.1.2“ 对应<0,1,2>
	vector<int> getVersion(string version){
		vector<int> result;
		if (version.size()<= 0)
			return result;
		int lastPos = 0, index;
		while ((index = version.find(".", lastPos)) != -1)
		{
			if (lastPos == index)
			{
				result.push_back(0);
			}else{
				string substr = version.substr(lastPos, index-lastPos);
				result.push_back(atoi(substr.c_str()));
			}
			lastPos =  index + 1;
		}
		string lastStr = version.substr(lastPos);
		result.push_back(atoi(lastStr.c_str()));
		return result;
	}
	
	int compareVersion(string version1, string version2){
		vector<int> v1 = getVersion(version1);
		vector<int> v2 = getVersion(version2);
		//将两版本号数组通过加0长度对齐
		int length = v1.size() - v2.size();
		for (int i=0; i<abs(length); i++)
		{
			if (length>0)
				v2.push_back(0);
			else
				v1.push_back(0);
		}
		
		//逐位比较数组元素
		for (int index = 0; index<v1.size(); index++)
		{
			if(v1[index] != v2[index])
				return (v1[index]>v2[index]) ? 1: -1;
		}
	
		return 0;
	}
};






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值