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

零、写在前面

         这是打卡的第二十天,今天题目还是有点难度的,不过就是题量下来了,可以沉淀一下之前的题目了,主要知识点在《算法零基础100讲》(第20讲) 进制转换(二) - 进阶icon-default.png?t=LA46https://blog.csdn.net/WhereIsHeroFrom/article/details/120876000


一、主要知识点

        1.进制的转换(也就是辗转相除法)

    while(columnNumber) {            
        num[ retSize++ ] = columnNumber % 26;
        columnNumber /= 26;
    }

二、课后习题 

168. Excel表列名称

168. Excel表列名称icon-default.png?t=LA46https://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 表列序号icon-default.png?t=LA46https://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. 最小好进制icon-default.png?t=LA46https://leetcode-cn.com/problems/smallest-good-base/

主要思想

这道题有一点复杂,因为包含了一点点数学 

我们很容易得到  n=k^{0}+k^{1}+k^{2}+...+k^{m}   当m>=1的时候有 n > k^{m}

m的个数明显是比k的可能情况少很多,便于循环查找

也就是k<n^{\frac{1}{m}} 并且当k>=2的时候且m>1的时候  {\color{Blue} (k^{0}+k^{1}+...+k^{m-1})^{\frac{1}{m}} < 1}{\color{Blue} k=\left \lfloor n^{\frac{1}{m}} \right \rfloor{\color{Blue} }}

当m==1的时候,我们很容易得到      k = n -1。

 题设条件告诉我们,k>=2,则有 n^{\frac{1}{m}}\geqslant 2也就是{\color{Blue} m \leqslant {log_{2}}^{}n }  用于判断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,最近还是得写论文,无论如何明天都要交了。我也不知道大家最近做题怎么样,难得就是入门吧,一定要加油,不抛弃不放弃才能得到最终的成功,如果必须要经历这些痛苦,早点经历不好么?

加油呀

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XingleiGao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值