2016年2月20日 星期六

LEET code -- 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.1"
"1.10"

是1.10 >1.1  
atof會轉成都是1.1


1
2
3
4
5
6
7
8
int compareVersion(char* version1, char* version2) {
    float v1=atof(version1);
    float v2=atof(version2);
    if(v1>v2)return 1;
    if(v1<v2)return -1;
    return 0;
    
}

-----------------

必須去計算. 之前的數字 跟.之後的數字
再去判斷誰大誰小
還要記得 一開始要先把0先砍了  01 跟1  是沒差的

但是這版本在
"0.1"
"0.0.1"
會失敗
我沒想到. 會多個


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int compareVersion(char* version1, char* version2) {
    
    while(*version1=='0')version1++; //01  --> is equal to 1
    while(*version2=='0')version2++;
    int v1=0,v2=0;
    while(*version1 && *version2){
        /*
        if(*version1 == *version2){
            version1++;
            version2++;
            continue;
        }
        */
        if(*version1=='.' && *version2!='.')return -1;
        if(*version1!='.' && *version2=='.')return 1;
        if(*version1=='.' && *version2=='.'){
            if(v1>v2)return 1;
            else if(v1<v2)return -1;
            v1=0;
            v2=0;
        }else{
            v1*=10;
            v2*=10;
            v1+= (int)*version1 -'0';
            v2+= (int)*version2  -'0';
            
            
        }        
        version1++;
        version2++;
     //   if(*version1>*version2)return 1;  //faile -->  4.0  10.0  , this will become 4>1
     //   else return -1;
        
    }
    if(!*version1 && !*version2){//both go to end;
        if(v1>v2)return 1;
        else if(v1<v2)return -1;
        else return 0; 
    }
    else if(*version1)return 1;
    else return -1;
}
---------------

這題解法應該是 
不斷的去記錄數字 值到 遇見 '.'
如果有一方先遇到.  就停下來另外一方 (第16 跟21
值到兩方都停在. (第8行
接著再去比較遇到 '.'之前的數字
如果有一方比較大 就回傳 
都依樣就繼續下去找

如果有一方先結束了(字串結束

另外一個剩下還有數字的  還要讓它繼續把數字找完整(第29  34
因為可能  1.8  1.20
如果不把完整20找出來 會誤判

接著  如果v1 v2都樣
還要再繼續判斷
後面還有沒有
因為 1.1   1.1.0  是一樣的
但是 1.1   1.1.1  會是1.1.1 比較大
所以後面還要跑  但是只要確認有沒有非0出現就好(45 53 行







 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
int compareVersion(char* version1, char* version2) {
    
    //while(*version1=='0')version1++; //01  --> is equal to 1
   // while(*version2=='0')version2++;
    int v1=0,v2=0;
    while(*version1 && *version2){

        if(*version1=='.' && *version2=='.'){//wait for both of v1 and v2 are '.' then compare
            version1++;
            version2++;
            if(v1>v2)return 1;
            else if(v1<v2)return -1;
            v1=0;
            v2=0;
        }
        if(*version1 !='.'){//wait for version2
            v1*=10;
            v1+= (int)*version1 -'0';
            version1++;
        }
        if(*version2 !='.'){
            v2*=10;
            v2+= (int)*version2  -'0';
            version2++;
        }

        
    }
    while(*version1 && *version1!='.'){//case 1.2  1.10
        v1*=10;
        v1+= (int)*version1 -'0';
        version1++;
    }
    while(*version2 && *version2!='.'){
        v2*=10;
        v2+= (int)*version2 -'0';
        version2++;
    }
    if(v1>v2)return 1;
    else if(v1<v2)return -1;
    else {
        if(*version1){
            version1++;
            while(*version1){
                if(*version1!='.' && *version1 != '0' ) return 1;//case 1.1   1 and 1.0.1 1
                version1++;
            }
            return 0; //case 1.0 1
        }
        else if(*version2 ){
            version2++;
            while(*version2){
                if(*version2!='.' && *version2!='0')return -1;//1 1.1
                version2++;
            }
            return 0; //case  1 1.0
        }
       else return 0;
    }
}





















沒有留言:

張貼留言