[解题报告](第20讲) 进制转换(二) - 进阶

简介: [解题报告](第20讲) 进制转换(二) - 进阶

零、写在前面


        这是打卡的第二十天,今天题目还是有点难度的,不过就是题量下来了,可以沉淀一下之前的题目了,主要知识点在

《算法零基础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;
}


结果分析

image.png


客官可还满意?


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;
}

结果分析

image.png


客官可还满意?


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;
}


结果分析

image.png


客官可还满意?


三、今日总结


不知道有没有人看这个部分,估计是没啥人看吧233,最近还是得写论文,无论如何明天都要交了。我也不知道大家最近做题怎么样,难得就是入门吧,一定要加油,不抛弃不放弃才能得到最终的成功,如果必须要经历这些痛苦,早点经历不好么?


加油呀


相关文章
【LeetCode-每日一题】-67. 二进制求和
【LeetCode-每日一题】-67. 二进制求和
【LeetCode-每日一题】-面试题46. 把数字翻译成字符串
【LeetCode-每日一题】-面试题46. 把数字翻译成字符串
华为机试每日一练--第七题: 进制转换
华为机试每日一练--第七题: 进制转换
华为机试每日一练--第七题: 进制转换
|
Serverless 测试技术
华为机试每日一练--第五题: 进制转换
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。 数据范围:保证结果在 1≤n≤2^31−1
华为机试每日一练--第五题: 进制转换
每日一题1055:进制转换
题目描述: 编程,输入一个10进制正整数,然后输出它所对应的八进制数。 样例输入:
81 0
|
算法 Java
进制转换(二) - 进阶
进制转换(二) - 进阶
113 0
进制转换(二) - 进阶
|
测试技术 Python
力扣LeetCode刷题心得之Python 宝石补给,罗马数字转整数
初始值为零,从左往右遍历,如果遍历当前的这个罗马数比下一位的小就减去这个罗马数,否则就加上
373 1
力扣LeetCode刷题心得之Python 宝石补给,罗马数字转整数
|
存储 机器学习/深度学习 算法
[解题报告](第19讲) 进制转换(一) - 入门(2)
[解题报告](第19讲) 进制转换(一) - 入门
[解题报告](第19讲) 进制转换(一) - 入门(2)
|
存储 算法
[解题报告](第19讲) 进制转换(一) - 入门(1)
[解题报告](第19讲) 进制转换(一) - 入门
[解题报告](第19讲) 进制转换(一) - 入门(1)