题解 | #进制转换#

进制转换

http://www.nowcoder.com/practice/2cc32b88fff94d7e8fd458b8c7b25ec1

nc112. 进制转换

题意

给你一个十进制数,求他的进制数对应的字符串。

1. 递归做法

首先看一下进制的定义:N进制就是逢N进一。
任何一个N进制数M都可以表示为如下形式:

其中,就是, 求出a0之后,我们可以继续对上式变形:

再套用上面的逻辑,对左边的数再对N取模即可得到. 以此类推可以设计递归解法,设原问题为f(M, N), 则有:

, 其中=M % N.

class Solution {
public:
    string F(int M, int N, int dep = 1) {
        // 本题数据略弱,没有考虑M为0的情况,如果不加辅助参数depth也能AC
        // 但是这里要特判一下,如果是第一层传进来就为0,那要返回0
        // 如果是递归过程中遇到了终点,要返回空字符串,否则答案中会出现前导0
        if (!M) return dep == 1 ? "0" : "";

        // 负数转化为正数
        if (M < 0) return "-" + F(-M, N);
        int a0 = M % N;
        string s0 = to_string(a0);
        if (a0 > 10) {
            s0 = 'A' + a0 - 10;
        }
        return F((M - a0) / N, N, dep+1) + s0;

    }
    string solve(int M, int N) {
        return F(M, N); // 默认为第一层,据上述公式实现
    }
};
  • 时间复杂度:, 因为每次不断把M除以N,总的复杂度是对数级别。
  • 空间复杂度:, 算法递归次,每次常数级别空间。

2. 非递归做法

非递归做法就是模拟我们小学奥数课的手算方法:(以4567转16进制为例,实际上也是上面的数学公式不断迭代求N的幂的系数的过程):

图片说明

因此,

用代码模拟上述过程即可。

class Solution {
public:
    /**
     * 进制转换
     * @param M int整型 给定整数
     * @param N int整型 转换到的进制
     * @return string字符串
     */
    string solve(int M, int N) {
        // 特判,本题没有的数据,但是要更加严谨
        if (!M) return "0";

        // 负数转化为正数
        if (M < 0) return "-" + solve(-M, N);
        string res;
        // 迭代出口为M=0
        while(M) {
            int a = M%N; // 求余数
            string s = to_string(a);
            if (a > 10) {
                s = 'A' + a - 10;
            }
            // 向前拼接
            res = s + res;
            // 求商,进行下一轮迭代
            M /= N;
        }
        return res;
    }
};
  • 时间复杂度:, 因为每次不断把M除以N,总的复杂度是对数级别。
  • 空间复杂度:, 变量res的长度是M的对数级别。
全部评论

相关推荐

Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 13:15
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务