2016年2月20日 星期六

LEET code -- Excel Sheet Column Title

Given a positive integer, return its corresponding column title as appear in an Excel sheet.
For example:

    1 -> A
    2 -> B
    3 -> C
    ...
    26 -> Z
    27 -> AA
    28 -> AB 



要把它改成 0->A   25->Z
再用shift來計算

下面是我第一版本  完全不行
因為她是用 1~26  正常算法是不行的






 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
char* convertToTitle(int n) {
    int num[6];
    num[0]=1;
    for(int i=1;i<6;i++){
        num[i]=num[i-1]*26;
        //printf("%d %d\n",i,num[i]);
    }
    
    char *ans =calloc(10,sizeof(char));
    char *te=ans;
    for(int i=5;i>=0 && n>0;i--){
        if(num[i]>(n-1))continue;
        
            *te++ = ((n-1)/num[i])+'A'-1;
            n=(n-1)%num[i];
        
        printf("%d\n",num[i]);
    }
    *te='\0';
    printf("%s",ans);
    return ans;
    
}














------------
正常解:
必須先算出來會有多少 空間要存

要注意 所有數字都要-1 才能算

因為 (n-1)%26  等同把n-1這個數字向右shift一位   reminder就是移出來的數字也就是26進位要輸出的數字

像是 10進位轉乘2進位
10 -->1010
每次10%2=0   最右邊的0   變成101
    10/2=5
     5%2=1   最右邊的1   變成10
    5/2=2   
    2%2=0    最右邊0    1
    2/2 =1
    1%2  =1   最右邊1    



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
char* convertToTitle(int n) {
    int i=n,size=0,reminder;
    while(i-->0){//find out how many world will produce. 
        i/=26;
        size++;
    }
    char *ans =calloc(size+1,sizeof(char));
    i=size;
    ans[size]='\0';
    printf(" %d",i);
    while(n>0){
        reminder=(n-1)%26;
        ans[--i]=reminder+'A';
        n=(n-1)/26;
        printf("%c %d",reminder+'A',i);
    }
    printf("%s",ans);
    return ans;
    
}










沒有留言:

張貼留言