题目描述
给定一个十进制数 M ,以及需要转换的进制数 N 。将十进制数 M 转化为 N 进制数。
当 N 大于 10 以后, 应在结果中使用大写字母表示大于 10 的一位,如 'A' 表示此位为 10 , 'B' 表示此位为 11 。
若 M 为负数,应在结果中保留负号。
方法一:暴力求解--连除取余,逆向相加
求解思路
对于本题,实现进制之间的转化,我们自然想到连除取余的方法,但是题目给的是进制N,因此有可能会出现超过9的数字,因此我们先设定一个字符串常量“0123456789ABCDEF”即可。对于暴力求解,使用连除法每次取余数,连接字符串的时候每次新出现的字符需要连接在前头。
解题代码
class Solution { public: string solve(int M, int N) { if(M == 0) return "0"; // 若是0,直接返回 string hyans = ""; bool myflag = false; // 记录是正数还是负数 if(M < 0) { myflag = true; M = -M; } string temp = "0123456789ABCDEF"; // 字符串常量 while(M) { //连除法 hyans = temp[M % N] + hyans; // 新字符在前,取余 M /= N;//连除操作 } if(myflag) hyans = "-" + hyans; // 负数添加符号 return hyans; // 返回结果 } };
复杂度分析
时间复杂度:连除操作,log级别的时间复杂度,因此为,M为十进制数大小。
空间复杂度:没有引入新的内存地址空间,空间复杂度为
方法二:优化解法--连除取余,字符串优化
求解思路
在第一种暴力解法的基础上,我们加入一个字符串从上到下记录数据,最后对字符串中的元素进行翻转操作即可。
解题代码
class Solution { public: string solve(int M, int N) { string t = "0123456789ABCDEF"; string myans = ""; // 存储结果 if(M==0) return "0"; bool nag = false; // 记录负数 if(M<0) { //负数的处理 nag = true; M=-M; } while(M) { myans += t[M%N]; M/=N; } if(nag) myans+="-"; reverse(myans.begin(), myans.end()); // 翻转 return myans; // 返回结果 } };
复杂度分析
时间复杂度:连除操作,log级别的时间复杂度,因此为,M为十进制数大小。
空间复杂度:数组空间的大小为结果的大小,即连除了多少次,也是log级别,因此为.