其他的Java答案感觉有些问题,应该是没法通过所有的test cases。没有try catch 去获取exception的话会碰到java.lang.NumberFormatException。
import java.util.*;
public class Solution {
public int compare (String version1, String version2) {
// write code here
if(version1==null||version2==null||version1.length()==0||version2.length()==0) return 0;
String[] v1 = version1.split("\\.");
String[] v2 = version2.split("\\.");
//由于存在两版本长度不同的情况,先对比共有的区间,如果前缀全部相同,再对比多出来的部分
int len = Math.min(v1.length,v2.length);
for(int i=0;i<len;i++){
v1[i]=stripZero(v1[i]);//去掉头部的0
v2[i]=stripZero(v2[i]);//去掉头部的0
if(v1[i].equals(v2[i])) continue;
int n1=0, n2=0;
try{ //如果能用int 去比较最好
n1 = Integer.parseInt(v1[i]);
n2 = Integer.parseInt(v2[i]);
}catch(Exception e){ //不能用int 比较就用java string 的compareTo
if(v1[i].compareTo(v2[i])>0){
return 1;
}else if(v1[i].compareTo(v2[i])<0){
return -1;
}else{
//return 0; 相同的跳出去比较下一个
continue;
}
}
//对于能转化成int 的版本号则用int 大小去对比
if(n1>n2){
return 1;
}else if(n1<n2){
return -1;
}else{
//return 0;
continue;
}
}
//开始对比前缀相同但是长度不同的版本号
if(v1.length>v2.length){ //版本号1 更长的时候
for(int i=len;i<v1.length;i++){
int n1 = 0;
try{ //同样的逻辑,能转化int 就用int 去对比,不能的用string。如果是0 的话就对比下一位,如果不是0就返回1
n1 = Integer.parseInt(v1[i]);
if(n1==0) continue;
else return 1;
}catch(Exception e){
return 1;
}
}
return 0;
}else if(v1.length<v2.length){ //版本号2 更长的时候
for(int i=len;i<v2.length;i++){
int n2 = 0;
try{
n2 = Integer.parseInt(v2[i]);
if(n2==0) continue;
else return -1;
}catch(Exception e){
return -1;
}
}
return 0;
}
return 0;
}
//去掉字符串头部的0的函数
public String stripZero(String s){
int i=0;
while(i<s.length()){
if(s.charAt(i)=='0'){
i++;
continue;
}
break;
}
return s.substring(i,s.length());
}
}


京公网安备 11010502036488号