- 题目描述
- 知识点及思路
总结
一.题目描述
简述:0.1 < 1.1 < 1.2 < 13.37<13.37.1 小数点之后为当前版本的子版本
二.知识点及思路
知识点:字符切分;类型转换;问题全面性考虑
思路:①按照点(.)进行字符切分,存入容器②将字符类型转换成整形③当靠左的数字不同,较大的版本高;相同则依次向右侧比较
代码如下:
class Solution {
private:
void split(const string& src, const string& separator, vector<string>& dest)
{
string str = src;
string substring;
string::size_type start = 0, index;
do
{
index = str.find_first_of(separator,start);
if (index != string::npos)
{
substring = str.substr(start,index-start);
dest.push_back(substring);
start = str.find_first_not_of(separator,index);
if (start == string::npos) return;
}
}while(index != string::npos);
//the last token
substring = str.substr(start);
dest.push_back(substring);
}
vector<int> itoa(vector<string>&versionSource)
{
vector<int>version;
for(int i=0;i<versionSource.size();i++)
version.push_back(atoi(versionSource[i].c_str()));
return version;
}
public:
int compareVersion(string version1, string version2)
{
vector<string>dest1,dest2;
split(version1, ".", dest1);
split(version2, ".", dest2);
vector<int>versionOne=itoa(dest1);
vector<int>versionTwo=itoa(dest2);
int sizeDiff = ((versionOne.size() - versionTwo.size()));
if (sizeDiff<0)
sizeDiff = -sizeDiff;
if(versionOne.size()>versionTwo.size())
for(int i=0;i<sizeDiff;i++)
versionTwo.push_back(0);
else
for(int i=0;i<sizeDiff;i++)
versionOne.push_back(0);
for(int i=0;i<versionOne.size();i++)
{
if(versionOne[i]>versionTwo[i])
return 1;
else if(versionOne[i]<versionTwo[i])
return -1;
}
return 0;
}
};
三.总结
I.①字符的切分由于c/c++语言没有提供,要掌握思路②类型转换当中atoi(const char*)类型,多注意小细节II.让我们一同努力,明天会更好!