其他的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()); } }