Problem
Compare two version numbers version1 and version2. If version1 > version2 return 1, if version1 < version2 return -1, otherwise return 0. You may assume that the version strings are non-empty and contain only digits and the . character. The . character does not represent a decimal point and is used to separate number sequences. Here is an example of version numbers ordering:
0.1 < 1.1 < 1.2 < 13.37
Examples
Example 1:
Input: version1 = "1.01", version2 = "1.001"
Output: 0
Explanation: Ignoring leading zeroes, both "01" and "001" represent the same integer "1".
Example 2:
Input: version1 = "1.0", version2 = "1.0.0"
Output: 0
Explanation: version1 does not specify revision 2, which means it is treated as "0".
Example 3:
Input: version1 = "0.1", version2 = "1.1"
Output: -1
Explanation: version1's revision 0 is "0", while version2's revision 0 is "1". 0 < 1, so version1 < version2.
Solution
The tricky part of the problem is to handle cases like 1.0 and 1. They should be equal.
Method 1 - Iterative
On way is to split the array, and then compare 1 part of version with another.
Here is a video explanation:
Code
Java
public int compareVersion(String version1, String version2) {
String[] arr1 = version1.split("\\.");
String[] arr2 = version2.split("\\.");
int i = 0;
while (i < arr1.length || i < arr2.length) {
if (i < arr1.length && i < arr2.length) {
if (Integer.parseInt(arr1[i])<Integer.parseInt(arr2[i])) {
return -1;
} else if (Integer.parseInt(arr1[i]) > Integer.parseInt(arr2[i])) {
return 1;
}
} else if (i < arr1.length) {
if (Integer.parseInt(arr1[i]) != 0) {
return 1;
}
} else if (i < arr2.length) {
if (Integer.parseInt(arr2[i]) != 0) {
return -1;
}
}
i++;
}
return 0;
}
Cleaner Code
Java
public int compareVersion(String version1, String version2) {
String[] v1 = version1.split("\\.");
String[] v2 = version2.split("\\.");
int maxParts = Math.max(v1.length, v2.length);
for ( int i = 0; i < maxParts; i++ ) {
int num1 = i < v1.length ? Integer.parseInt( v1[i] ) : 0;
int num2 = i < v2.length ? Integer.parseInt( v2[i] ) : 0;
if ( num1 < num2 ) {
return -1;
} else if ( num1 > num2 ) {
return +1;
}
}
return 0;
}
Method 2 - Iterative solution using StringTokenizer
Code
Java
public int compareVersion(String version1, String version2) {
StringTokenizer st1 = new StringTokenizer(version1, ".");
StringTokenizer st2 = new StringTokenizer(version2, ".");
while (st1.hasMoreTokens() && st2.hasMoreTokens()) {
int token1 = Integer.parseInt(st1.nextToken());
int token2 = Integer.parseInt(st2.nextToken());
if (token1 > token2) {
return 1;
} else if (token2 > token1) {
return -1;
}
}
boolean left = st1.countTokens() > st2.countTokens();
StringTokenizer remaining = left ? st1: st2;
while (remaining.hasMoreTokens()){
if (Integer.parseInt(remaining.nextToken()) > 0) {
return left ? 1 : -1;
}
}
return 0;
}