165. 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

链接: http://leetcode.com/problems/compare-version-numbers/

6/16/2017

3ms, 21%

注意的问题

1. 第6,7行,string.split()对于以dot分隔的话,需要转义成\\.

2. Integer.parseInt(), Integer.toString()分别用于string->int, int->string

3. 前一部分每一块需要比较empty string

4. 如果长度不等的话,不但需要比较长度,还要比较多余长度里面是不是都是0,如果是的话2个version还是一样的。

 1 public class Solution {
 2     public int compareVersion(String version1, String version2) {
 3         if (version1 == null || version2 == null) {
 4             return 0;
 5         }
 6         String[] v1 = version1.split("\\.");
 7         String[] v2 = version2.split("\\.");
 8         
 9         for (int i = 0, j = 0; i < v1.length && j < v2.length; i++, j++) {
10             if (v1[i].equals("") && v2[i].equals("")) {
11                 continue;
12             }
13             if (v1[i].equals("") || Integer.parseInt(v1[i]) < Integer.parseInt(v2[i])) {
14                 return -1;
15             } else if (v2[i].equals("") || Integer.parseInt(v2[i]) < Integer.parseInt(v1[i])) {
16                 return 1;
17             }
18         }
19         if (v1.length > v2.length) {
20             for (int i = v2.length; i < v1.length; i++) {
21                 if (Integer.parseInt(v1[i]) != 0) {
22                     return 1;
23                 }
24             }
25             return 0;
26         } else if (v1.length < v2.length) {
27             for (int i = v1.length; i < v2.length; i++) {
28                 if (Integer.parseInt(v2[i]) != 0) {
29                     return -1;
30                 }
31             }
32             return 0;            
33         }
34         return 0;
35     }
36 }

别人的答案,2个版本都比我的好,一个是将empty string变为0,一个直接用数字来计算。

http://www.cnblogs.com/yrbbest/p/4491633.html

其他答案

https://discuss.leetcode.com/topic/6238/accepted-small-java-solution

 1 public int compareVersion(String version1, String version2) {
 2     String[] levels1 = version1.split("\\.");
 3     String[] levels2 = version2.split("\\.");
 4     
 5     int length = Math.max(levels1.length, levels2.length);
 6     for (int i=0; i<length; i++) {
 7         Integer v1 = i < levels1.length ? Integer.parseInt(levels1[i]) : 0;
 8         Integer v2 = i < levels2.length ? Integer.parseInt(levels2[i]) : 0;
 9         int compare = v1.compareTo(v2);
10         if (compare != 0) {
11             return compare;
12         }
13     }
14     
15     return 0;
16 }

https://discuss.leetcode.com/topic/11410/my-2ms-easy-solution-with-c-c

 1 int compareVersion(string version1, string version2) {
 2     int i = 0; 
 3     int j = 0;
 4     int n1 = version1.size(); 
 5     int n2 = version2.size();
 6     
 7     int num1 = 0;
 8     int num2 = 0;
 9     while(i<n1 || j<n2)
10     {
11         while(i<n1 && version1[i]!='.'){
12             num1 = num1*10+(version1[i]-'0');
13             i++;
14         }
15         
16         while(j<n2 && version2[j]!='.'){
17             num2 = num2*10+(version2[j]-'0');;
18             j++;
19         }
20         
21         if(num1>num2) return 1;
22         else if(num1 < num2) return -1;
23         
24         num1 = 0;
25         num2 = 0;
26         i++;
27         j++;
28     }
29     
30     return 0;
31 }

更多讨论

https://discuss.leetcode.com/category/173/compare-version-numbers

posted @ 2017-06-16 19:54  panini  阅读(167)  评论(0编辑  收藏  举报