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
就是比较版本号,需要注意的地方是处理各种exception。
代码如下:
/*
* 版本号比较
* */
public class Solution
{
public int compareVersion(String version1, String version2)
{
//这里split的要求是RE格式,所以是这样写
String [] verA=version1.split("\\.");
//这里是为了处理没有包含 . 的情况
if(verA.length==0)
{
verA=new String[1];
verA[0]=version1;
}
String [] verB=version2.split("\\.");
if(verB.length==0)
{
verB=new String[1];
verB[0]=version2;
}
int len=Math.min(verA.length, verB.length);
for(int i=0;i<len;i++)
{
int a=Integer.parseInt(verA[i]);
int b=Integer.parseInt(verB[i]);
if(a>b)
return 1;
else if(a<b)
return -1;
}
//处理长度不等的情况
if(verA.length>verB.length)
{
//这里是处理 1.0 和 1 的情况
boolean isZero=true;
for(int i=len;i<verA.length;i++)
{
if(Integer.parseInt(verA[i])!=0)
{
isZero=false;
break;
}
}
if(isZero)
return 0;
else
return 1;
}
else if(verA.length<verB.length)
{
//这里是处理 1.0 和 1 的情况
boolean isZero=true;
for(int i=len;i<verB.length;i++)
{
if(Integer.parseInt(verB[i])!=0)
{
isZero=false;
break;
}
}
if(isZero)
return 0;
else
return -1;
}
else
return 0;
}
}
下面是C++的做法,这个做法我是看的网上的一个做法,要比我的Java做法简单多了,很值得学习
问题很简单,但是需要考虑的case有点烦
代码如下:
#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <string>
#include <climits>
#include <algorithm>
#include <sstream>
#include <functional>
#include <bitset>
#include <numeric>
#include <cmath>
#include <regex>
using namespace std;
class Solution
{
public:
int compareVersion(string version1, string version2)
{
stringstream ss1(version1), ss2(version2);
string a;
vector<int> aa, bb;
while (getline(ss1, a, '.'))
aa.push_back(stoi(a));
while (getline(ss2, a, '.'))
bb.push_back(stoi(a));
int i = 0;
while (aa[aa.size() - 1] == 0)
aa.pop_back();
while (bb[bb.size() - 1] == 0)
bb.pop_back();
while (i < min(aa.size(), bb.size()))
{
if (aa[i] < bb[i])
return -1;
else if (aa[i] > bb[i])
return 1;
i++;
}
if (aa.size() > bb.size())
return 1;
else if (aa.size() < bb.size())
return -1;
else
return 0;
}
};