题目链接:https://leetcode.com/problems/compare-version-numbers/
题目:
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.
For instance, 2.5 is not "two and a half" or "half way to version three", it is the fifth second-level revision of the second first-level revision.
Here is an example of version numbers ordering:
0.1 < 1.1 < 1.2 < 13.37
解题思路:
这题的考点是字符串的处理。
1. 将字符串按点号“.”拆分。注意正则化表达式需要加“\\”进行转义。为“\\.”
2. 依次比较拆分后的每个字符串的大小
这题总体不难,但是需要考虑的小细节很多。
比如:
1. 数字前缀为0
2. “1.0”“1”相等
3. 不能采取纯字符串比较,字符串按字典序比较”1.2”“1.10”
4. 拆分字符串前需要先用contains(”.”)判断字符串是否包含
代码实现:
public class Solution {
public int compareVersion(String version1, String version2) {
String[] nums1 = null;
String[] nums2 = null;
if(version1.contains("."))
nums1 = version1.split("\\.");
else {
nums1 = new String[1];
nums1[0] = version1;
}
if(version2.contains("."))
nums2 = version2.split("\\.");
else {
nums2 = new String[1];
nums2[0] = version2;
}
int i = 0;
int flag = 0;
for(i = 0; i < nums1.length || i < nums2.length; i ++) {
if(i < nums1.length && i < nums2.length)
flag = myCompare(nums1[i], nums2[i]);
else if(i < nums1.length && i >= nums2.length)
flag = myCompare(nums1[i], "0");
else if(i >= nums1.length && i < nums2.length)
flag = myCompare("0", nums2[i]);
if(flag != 0)
return flag;
}
return 0;
}
int myCompare(String s1, String s2) {
int i = 0;
int j = 0;
while(i < s1.length()) {
if(s1.charAt(i) == '0')
i ++;
else break;
}
if(i == s1.length())
s1 = "0";
else
s1 = s1.substring(i, s1.length());
while(j < s2.length()) {
if(s2.charAt(j) == '0')
j ++;
else break;
}
if(j == s2.length())
s2 = "0";
else
s2 = s2.substring(j, s2.length());
int flag = 0;
if(s1.length() > s2.length())
return 1;
else if(s1.length() < s2.length())
return -1;
else {
flag = s1.compareTo(s2);
if(flag > 0)
return 1;
else if(flag < 0)
return -1;
else
return 0;
}
}
}
71 / 71 test cases passed.
Status: Accepted
Runtime: 4 ms