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;
}
|
沒有留言:
張貼留言