目录
题目?
解题思路
代码细节理解
C语言代码?
题目
?
?
?来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/excel-sheet-column-title 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
这是一道进制转换类型的题目。十进制转换为26进制使用除商逆序取余法。
资料:
C语言的进制转换以及算法实现_黑虎阿福的博客-CSDN博客_c语言进制转换算法
注意到当columnNumber=26*n时,取余remainder=0,但应该为26,才可转换为Z。
所以当remainder=0时,向上一位借一位(comlumnNumber-=26),使remainder=26即可。
代码细节理解
关于swap(ret,cnt)的问题:数组名称为数组第一个元素的地址,因此用数组名作为实参就可以将数组的起始地址传递给被调函数。所以当被调函数在函数体中修改数组元素时,真正修改的是存储在原存储单元中的数组元素。
?关于ret[cnt++] = remainder + 64:由于ret是字符型数组,可以用数字代码值来赋值。表示先给remainder+64,之后cnt++,指向下一位数组。
C语言代码?
void swap(char* set, int len);
char* convertToTitle(int columnNumber) {
char* ret = (char*)malloc(sizeof(char) * 8);
int cnt = 0; //数组下标
while (columnNumber) {
int remainder = columnNumber % 26;
if (remainder == 0) {
remainder = 26;
columnNumber -= 26;
}
ret[cnt++] = remainder + 64; //A的Ascii码为65。
columnNumber /= 26;
}
ret[cnt] = '\0'; //最后一位\0结尾。
swap(ret, cnt);
return ret;
}
void swap(char* set,int len) { //字符串反转
int left = 0;
int right = len - 1;
while (left < right) {
int temp = set[left];
set[left] = set[right];
set[right] = temp;
left++;
right--;
}
}
最后,码字不易,看完记得点个赞和关注再走哦。
|