目录
题目
解题思路
代码细节理解
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] = ''; //最后一位结尾。 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--; } }
最后,码字不易,看完记得点个赞和关注再走哦。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)