蓝桥杯 十六进制转八进制(java实现)

这里写图片描述

下面是测试数据(这个数据太大了,感受数据支配的恐惧,导致常规方法行不通)
这里写图片描述

代码虽然多,但是可以看其思想,执行效率还是非常高的。CPU使用情况500ms,内存使用48MB。哈哈,比网上的效率要高很多呢。用了switch case ,造成代码太繁琐,不过都是复制粘贴,根本就不影响时间。
以下是对比,第一行是自己写的,第二行是写完第二天后从网上找的。对比情况如下
这里写图片描述

思想是字符串的使用,先将16进制转换成2进制,1位16进制对应4位二进制,1位8进制对应3位二进制,用数组方式进行查找,用可变字符串 StringBuilder(效率更高) 或者StringBuffer(线程安全)接受。。。有什么看不懂的评论即可。


import java.util.Scanner;

/**
 * 16进制转8进制 每个16进制长度不超过10万。、 所以这就是超大数
 * 
 * @author banaa
 *
 */

public class Main {

    static String[] bin = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010",
            "1011", "1100", "1101", "1110", "1111" };
    static String[] oct = { "0", "1", "2", "3", "4", "5", "6", "7" };

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        int num = s.nextInt();

        String[] str = new String[num];
        for (int i = 0; i < num; i++) {
            str[i] = s.next();
        }

        for(int i=0; i<num; i++) {
            String result = hexToBin(str[i]).toString();
            String octResult = binToOct(result);
            if(octResult.startsWith("0")) {
                octResult = octResult.substring(1);
            }
            if(octResult.startsWith("0")) {
                octResult = octResult.substring(1);
            }
            System.out.println(octResult);
        }
    }

    private static StringBuffer hexToBin(String str) {
        int length = str.length();
        int start = 0;
        int end = 1;
        StringBuffer result = new StringBuffer();
        for (int i = 0; i < length; i++) {
            String subStr = str.substring(start, end);
            start++;
            end++;
            String s = transform(subStr);
            result.append(s);
        }
        return result;
    }

    private static String binToOct(String str) {
        int length = str.length();
        if(length % 3 == 1) {
            str= "00"+str;
        } else if(length % 3 == 2) {
            str = "0"+str;
        }
        int start = 0;
        int end = 3;
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<str.length()/3; i++) {
            String subStr = str.substring(start, end);
            start += 3;
            end += 3;
            String s = transform2(subStr);
            sb.append(s);
        }
        return sb.toString();
    }

    private static String transform(String str) {
        String result = "";
        switch (str) {
        case "0":
            result = bin[0];
            break;
        case "1":
            result = bin[1];
            break;
        case "2":
            result = bin[2];
            break;
        case "3":
            result = bin[3];
            break;
        case "4":
            result = bin[4];
            break;
        case "5":
            result = bin[5];
            break;
        case "6":
            result = bin[6];
            break;
        case "7":
            result = bin[7];
            break;
        case "8":
            result = bin[8];
            break;
        case "9":
            result = bin[9];
            break;
        case "A":
            result = bin[10];
            break;
        case "B":
            result = bin[11];
            break;
        case "C":
            result = bin[12];
            break;
        case "D":
            result = bin[13];
            break;
        case "E":
            result = bin[14];
            break;
        case "F":
            result = bin[15];
            break;
        default:
            break;
        }
        return result;
    }

    private static String transform2(String str) {
        String result = "";
        switch (str) {
        case "000":
            result = oct[0];
            break;
        case "001":
            result = oct[1];
            break;
        case "010":
            result = oct[2];
            break;
        case "011":
            result = oct[3];
            break;
        case "100":
            result = oct[4];
            break;
        case "101":
            result = oct[5];
            break;
        case "110":
            result = oct[6];
            break;
        case "111":
            result = oct[7];
            break;
        }

        return result;

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值