注意几个细节:比较大小时可以使用字符串比较,也可以转换成int类型比较,
(1)把string转换成int要注意 当字符串表示的数字超出int范围的情况,不然会报错; (2)用string比较时,要注意字符长度不同的情况,因为直接string比较,“226”是小于“36”的,但在这里的版本比较,“226”是要大于“36”的,所以判断语句就变成了: 既要比较长度也有比较大小,即
v1[i].length() > v2[j].length()
// 和
(v1[i].length() == v2[j].length() && v1[i] > v2[j])
思路一:
// 字符串比较,能通过所有实例
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 比较版本号
* @param version1 string字符串
* @param version2 string字符串
* @return int整型
*/
int compare(string version1, string version2) {
// write code here
vector<string> v1 = split(version1, '.');
vector<string> v2 = split(version2, '.');
int i=0, j=0;
while(i < v1.size() && j < v2.size()){
if(v1[i].length() > v2[j].length() || (v1[i].length() == v2[j].length() && v1[i] > v2[j])){
return 1;
}
else if(v1[i].length() < v2[j].length() || (v1[i].length() == v2[j].length() && v1[i] < v2[j])) {
return -1;
}
i++;
j++;
}
while(i< v1.size()){
if(v1[i] > "0"){
return 1;
}
i++;
}
while(j < v2.size()){
if(v2[j] > "0"){
return -1;
}
j++;
}
return 0;
}
vector<string> split(string str, char pat){
int left=0, right=0;
vector<string> res;
while(right < str.length()){
while(right<str.length() && str[right] != pat){
right++;
}
if(right-left>1 && str[left] == '0'){
while(left<right-1 && str[left] == '0'){
left++;
}
}
string temp = str.substr(left, right-left);
res.push_back(temp);
left = right+1;
right++;
}
return res;
}
};
思路二:
// int型比较,不能通过所有实例
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 比较版本号
* @param version1 string字符串
* @param version2 string字符串
* @return int整型
*/
int compare(string version1, string version2) {
// write code here
vector<int> v1 = split(version1, '.');
vector<int> v2 = split(version2, '.');
int i=0, j=0;
while(i < v1.size() && j < v2.size()){
if(v1[i] > v2[j]){
return 1;
}
else if(v1[i] < v2[j]){
return -1;
}
i++;
j++;
}
while(i< v1.size()){
if(v1[i] > 0){
return 1;
}
i++;
}
while(j < v2.size()){
if(v2[j] > 0){
return -1;
}
j++;
}
return 0;
}
vector<int> split(string str, char pat){
int left=0, right=0;
vector<int> res;
while(right < str.length()){
while(right<str.length() && str[right] != pat){
right++;
}
if(right-left>1 && str[left] == '0'){
while(left<right-1 && str[left] == '0'){
left++;
}
}
string temp = str.substr(left, right-left);
res.push_back(atoi(temp.c_str()));
left = right+1;
right++;
}
return res;
}
};