蓝桥杯---16进制转8进制---java实现(耗时156ms)

题目:
在这里插入图片描述
在这里插入图片描述
这道题对于java来讲,乍一看,转换是一行代码就可以搞定的。

//octo是八进制字符串;
//hex是16进制字符串;
String octo = Integer.toOctalString(Integer.valueOf(hex, 16));

16进制先转成10进制再转成8进制,调用函数还是so easy的!
不过运行后的结果是:运行错误
在这里插入图片描述
知道吗,在测试集中存在长度为10万的16进制字符串,这意味着,整型的溢出。
int类型不行,Long当然也不行!
所以这样的方法自然行不通!
接着我就开始了csdn之旅!
先感谢Poison_updiadestiny两位博主。

我尝试的第一种方法是第一位博主的切割法
因为字符串太长,直接转换成10进制会超出整型的范围,而3位16进制的二进制位长度与4位8进制的二进制位长度同是12位,所以将16进制字符串从尾开始每三个字符一份,转化成4位8进制,转化用的是上面的那段代码,三位16进制远小于int型的最大值。
不过写出来放到网上去跑,结果是:运行超时
在这里插入图片描述

我尝试的第二种方法是16进制–>2进制–>8进制
思路就是:1位十六进制对应4位二进制,3位二进制对应1位八进制。java代码如下:

import java.util.HashMap;
import java.util.Scanner;

public class Main {
	static HashMap<Character, String> maphex =new HashMap<Character, String>(); 
	
	public static void init()
	{
		maphex.put('0', "0000");
		maphex.put('1', "0001");
		maphex.put('2', "0010");
		maphex.put('3', "0011");
		maphex.put('4', "0100");
		maphex.put('5', "0101");
		maphex.put('6', "0110");
		maphex.put('7', "0111");
		maphex.put('8', "1000");
		maphex.put('9', "1001");
		maphex.put('A', "1010");
		maphex.put('B', "1011");
		maphex.put('C', "1100");
		maphex.put('D', "1101");
		maphex.put('E', "1110");
		maphex.put('F', "1111");
	}
	
	public static String binToOctal(char[] bin)//二进制转成8进制
	{
		char[] octal = new char[bin.length/3 + (bin.length%3==0 ? 0:1)];
		int index = octal.length - 1;
		
		for(int i = bin.length - 1; i >= 0; i--)
		{
			int sum = bin[i] - '0';
			if(i-1>=0) 
				sum += (bin[--i] - '0') * 2;
			if(i-1>=0)
				sum += (bin[--i] - '0') * 4;
			octal[index--] = (char)(sum+'0');
		}
		
		//去掉最前面的0
		int begin = 0;
		while(octal[begin] == '0')
			begin++;
		
		return String.copyValueOf(octal, begin, octal.length-begin);
	}
	
	public static void main(String[] args) {
		//输入
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		String[] str = new String[n];
		scan.nextLine();
		
		for(int i  = 0; i< n; i++)
		{
			str[i] = scan.nextLine();
		}
		
		init();//初始化哈希映射
		
		for(String hex : str)//开始转化
		{
			char[] bin = new char[hex.length()*4];
			int index = 0;
			for(Character c : hex.toCharArray())//16进制转换为2进制
			{
				String temp = maphex.get(c);
				for(int i=0;i<4;i++)
					bin[index++] = temp.charAt(i);
			}
			
			System.out.println(binToOctal(bin));
			
		}
		
	}
}

在这里插入图片描述
第二位博主C++代码跑出来的结果是
在这里插入图片描述
比我写的java更优!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值