题解 | #比较版本号#
比较版本号
https://www.nowcoder.com/practice/2b317e02f14247a49ffdbdba315459e7
思路:
正常截取字符串,然后比较字符串数组中的每个数字;如果数字存在以0开头的,则截取子串即可,转换为整数比较大小
如果存在数组长短不一样,则短的数组直接用字符"0"代替。
思路简单易理解
/**
* 时间 复杂度为n
*
* 就正常分割字符串,然后比较字符串数组中,每一个数字的大小,如果是以0开头,则截取字符串
*
*
* @param version1
* @param version2
* @return
*/
public static int compare (String version1, String version2) {
String[] array1 = version1.split("\\.");
String[] array2 = version2.split("\\.");
int len1 = array1.length;
int len2 = array2.length;
int index = 0;
for (; index < Math.min(len1, len2); index++) {
int ret = compareSignal(array1[index], array2[index]);
if (ret != 0) {
return ret;
}
}
if (len1 > len2){
for (;index < len1; index++){
int ret = compareSignal(array1[index], "0");
if (ret !=0) {
return ret;
}
}
} else {
for (;index < len2; index++){
int ret = compareSignal("0", array2[index]);
if (ret !=0) {
return ret;
}
}
}
return 0;
}
/**
* 比较字符串数组中的每个字符串,将字符串转换为整数比较即可
*
* @param str1
* @param str2
* @return
*/
private static int compareSignal(String str1, String str2){
int v1 = Integer.parseInt(str1.substring(getIndex(str1)));
int v2 = Integer.parseInt(str2.substring(getIndex(str2)));
if (v1 == v2) return 0;
return v1 > v2 ? 1 : -1;
}
/**
* 如果字符串以0开头,则截取字符串,直到不为0开始,返回这个索引,用于截取后面的数字
*
* 如果所有数字都是0,则返回0即可。
*
* @param str
* @return
*/
private static int getIndex(String str){
int index = 0;
if (str.startsWith("0")){
for (char ch : str.toCharArray()){
if (ch == '0') {
index++;
} else {
break;
}
}
}
if (index >= str.length()) {
return 0;
}
return index;
}
我的刷题题解 文章被收录于专栏
自己在刷题过程中的一些思路和见解记录

