题解 | #进制转换#

进制转换

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

进制转换

描述

给定一个十进制数 M ,以及需要转换的进制数 N 。将十进制数 M 转化为 N 进制数。当 N 大于 10 以后, 应在结果中使用大写字母表示大于 10 的一位,如 'A' 表示此位为 10 , 'B' 表示此位为 11 。若 M 为负数,应在结果中保留负号。

方法一(递归)

思路分析

本题需要将十进制M数转换为N进制,接着我们通过几个例子对其进行分析:
  • 我们首先分析N=2,M=10的情况,如果我们需要将十进制数10转换为二进制数,我们要做的就是不断的将10对2进行整除,直到商小于2,并且记录所有的余数,之后将所有的余数逆序输出即可得到十进制数转换为二进制数。
  • 我们分析当N=8,M=1000的情况,如果我们需要将十进制数1000转换为八进制数,我们要做的就是不断的将1000对8进行整除,直到商小于8,并且记录所有的余数,之后将所有的余数逆序输出即可得到十进制数转换为八进制数。
  • 我们分析当N=16,M=10000的情况,如果我们需要将十进制数10000转换为十六进制数,我们要做的就是不断的将10000对16进行整除,直到商小于16,并且记录所有的余数,之后将所有的余数逆序输出即可得到十进制数转换为十六进制数,需要注意的是我们需要将余数大于 10 的一位使用大写字母表示,例如10使用A表示等等。
通过分析我们得到一般性的结论十进制数在转换成任何进制数时,均为除其进制取余,因为中间过程涉及逆序输出,因此使用递归的办法比较有效。需要注意的是当M小于0时,对其取负进行计算,最后增加负号即可。

图解

思路分析中的图解如下:

核心代码

import java.util.*;


public class Solution {
    /**
     * 进制转换
     * @param M int整型 给定整数
     * @param N int整型 转换到的进制
     * @return string字符串
     */
    static String s=new String();
    public static void convert(int n,int b) {
		if(n>0) 
        {
			switch(n%b) {
			case 10:s="A"+s;break;
			case 11:s="B"+s;break;
			case 12:s="C"+s;break;
			case 13:s="D"+s;break;
			case 14:s="E"+s;break;
			case 15:s="F"+s;break;
			default:s=String.valueOf(n%b)+s;
			}
		}
		if(n!=0) {
			convert(n/b,b);
		}
	}    
    public String solve (int M, int N) {
        // write code here
        int index=1;//判断正负数标志
        if(M<0) 
        {
            M=-M; 
            index=-1;
        } 
        convert(M,N);
        if(index==-1) s="-"+s;
        return s;
    }
}
复杂度分析
  • 时间复杂度:对M不断的整除N,因此时间复杂度为
  • 空间复杂度:该算法使用递归操作,递归过程中使用栈,栈空间为,因此时间复杂度为

方法二+迭代

思路分析

方法二是对方法一的改变,将递归过程转换为迭代过程,即不断的对M进行整除,然后将余数再次赋值给M,迭代的思想更易理解。

核心代码

import java.util.*;


public class Solution {
    /**
     * 进制转换
     * @param M int整型 给定整数
     * @param N int整型 转换到的进制
     * @return string字符串
     */
    static String s=new String();
    public static void convert(int n,int b) {
		while(n>0) 
        {
			switch(n%b) {
			case 10:s="A"+s;break;
			case 11:s="B"+s;break;
			case 12:s="C"+s;break;
			case 13:s="D"+s;break;
			case 14:s="E"+s;break;
			case 15:s="F"+s;break;
			default:s=String.valueOf(n%b)+s;
			}
            n=n/b;
		}
	}    
    public String solve (int M, int N) {
        // write code here
        int index=1;//判断正负数标志
        if(M<0) 
        {
            M=-M; 
            index=-1;
        } 
        convert(M,N);
        if(index==-1) s="-"+s;
        return s;
    }
}
复杂度分析
  • 时间复杂度:对M不断的整除N,因此时间复杂度为
  • 空间复杂度:程序必要的空间为存储生成的N进制数,与方法一不同,因此空间复杂度$O(1)$




全部评论

相关推荐

NBA球星伦纳德:jd是这样的,工作连拧螺丝都算不上
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
3209次浏览 43人参与
# HR最不可信的一句话是__ #
1021次浏览 32人参与
# MiniMax求职进展汇总 #
24901次浏览 321人参与
# 春招至今,你的战绩如何? #
14766次浏览 137人参与
# AI面会问哪些问题? #
893次浏览 22人参与
# 你的实习产出是真实的还是包装的? #
2722次浏览 52人参与
# 巨人网络春招 #
11484次浏览 224人参与
# 沪漂/北漂你觉得哪个更苦? #
1235次浏览 38人参与
# 你做过最难的笔试是哪家公司 #
1131次浏览 20人参与
# AI时代,哪个岗位还有“活路” #
2684次浏览 49人参与
# XX请雇我工作 #
51147次浏览 171人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7966次浏览 43人参与
# 简历第一个项目做什么 #
32073次浏览 357人参与
# 简历中的项目经历要怎么写? #
310908次浏览 4257人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152832次浏览 889人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187556次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64539次浏览 864人参与
# 如果重来一次你还会读研吗 #
229974次浏览 2011人参与
# 投格力的你,拿到offer了吗? #
178254次浏览 891人参与
# 你怎么看待AI面试 #
180654次浏览 1296人参与
# 正在春招的你,也参与了去年秋招吗? #
364172次浏览 2641人参与
# 腾讯音乐求职进展汇总 #
160822次浏览 1114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务