- 題目描述
- 知識點及思路
總結
一.題目描述
簡述: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.讓我們一同努力,明天會更好!