零、写在前面
这是打卡的第二十天,今天题目还是有点难度的,不过就是题量下来了,可以沉淀一下之前的题目了,主要知识点在
《算法零基础100讲》(第20讲) 进制转换(二) - 进阶
https://blog.csdn.net/WhereIsHeroFrom/article/details/120876000
一、主要知识点
1.进制的转换(也就是辗转相除法)
while(columnNumber) { num[ retSize++ ] = columnNumber % 26; columnNumber /= 26; }
二、课后习题
168. Excel表列名称
168. Excel表列名称
https://leetcode-cn.com/problems/excel-sheet-column-title/
主要思想
1.转化为26进制,由于1的影响我们需要再判断的时候加入余数为0的时候的借位
2.将生成的字符串反转
char * convertToTitle(int columnNumber){ char *s = malloc(sizeof(char) * 256); //申请返回空间 int count = 0; while(columnNumber){ //转数组 if(columnNumber % 26 != 0) s[count++] = columnNumber % 26 +'A' - 1; else { //等于0的时候借位 s[count++] = 'Z'; columnNumber --; } columnNumber /= 26; } s[count] = 0; //加入结束符 for(int i = 0;i < count/2;i++){ //反转字符串 s[i] = s[i] ^ s[count - i - 1]; s[count - 1 - i] = s[i] ^ s[count - 1 - i]; s[i] = s[i] ^ s[count - i - 1]; } return s; }
结果分析
客官可还满意?
171. Excel 表列序号
171. Excel 表列序号
https://leetcode-cn.com/problems/excel-sheet-column-number/
主要思想
有了第一题的思想,这道题就是洒洒水啦,注意一下需要+1就好了
int titleToNumber(char * columnTitle){ int count = 0; //统计数字 for(int i = 0;columnTitle[i];++i){ count *= 26; count += columnTitle[i] - 'A' + 1; //1的对应补偿 } return count; }
结果分析
客官可还满意?
483. 最小好进制
483. 最小好进制
https://leetcode-cn.com/problems/smallest-good-base/
主要思想
这道题有一点复杂,因为包含了一点点数学
我们很容易得到 当m>=1的时候有
m的个数明显是比k的可能情况少很多,便于循环查找
也就是 并且当k>=2的时候且m>1的时候 即
当m==1的时候,我们很容易得到 k = n -1。
题设条件告诉我们,k>=2,则有 也就是 用于判断m最大值
这里也可以看出来m小很多,而k是要从2到n;
我们按照上面的方式查找,找到以后返回就好了,注意转字符串的反转。
char * smallestGoodBase(char * n){ long long nval = 0,k; for(int i = 0;n[i];++i){ //字符串转整形 nval *= 10; nval += n[i] -'0'; } int mmax = log(nval)/log(2); //m位数的最大值向下取整 for(;mmax > 1;mmax--){ //枚举m尝试找到k k = pow(nval,1.0/mmax); //k一定等于向下取整 m=1的时候不能这么计算 long long temp = nval; while(temp){ if(temp % k != 1) break; temp /= k; } if(temp == 0) break; } char *ans = malloc(sizeof(char) * (mmax + 1));//创建返回函数 int i = 0; if(mmax == 1) k = nval - 1; //如果mmax = 1 则k等于最大值-1 while(k){ ans[i++] = k % 10 + '0'; k /= 10; } ans[i] = 0; //插入结束符 for(int j = 0;j < i / 2;j++){ //反转字符串 ans[j] = ans[j] ^ ans[i - 1 - j]; ans[i - 1 - j] = ans[j] ^ ans[i - 1 -j]; ans[j] = ans[j] ^ ans[i - 1 - j]; } return ans; }
结果分析
客官可还满意?
三、今日总结
不知道有没有人看这个部分,估计是没啥人看吧233,最近还是得写论文,无论如何明天都要交了。我也不知道大家最近做题怎么样,难得就是入门吧,一定要加油,不抛弃不放弃才能得到最终的成功,如果必须要经历这些痛苦,早点经历不好么?
加油呀