我的蓝桥杯代码仓:https://github.com/617076674/lanqiao
题目描述:
知识点:进制转换
思路:先将十六进制转换成二进制,再将二进制转换成八进制
为防止超时,用一个数组来保存十六进制和二进制间的对应关系,用一个哈希表来保存二进制和八进制间的对应关系。
由于在二进制转八进制的过程中,为方便处理,我将字符串翻转了,所以哈希表中存储的是逆序的二进制序列和其对应的八进制值。由于翻转后会存在字符串末端不足3位的情况,因此哈希表中的键需要包含2个字符及1个字符的二进制序列。
JAVA代码:
import java.util.HashMap;
import java.util.Scanner;
public class Main {
private static String[] hexToBinary = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
private static HashMap<String, String> binaryToOct; //存储逆序的2进制序列和对应的8进制值
static {
binaryToOct = new HashMap<String, String>();
binaryToOct.put("000", "0");
binaryToOct.put("100", "1");
binaryToOct.put("010", "2");
binaryToOct.put("110", "3");
binaryToOct.put("001", "4");
binaryToOct.put("101", "5");
binaryToOct.put("011", "6");
binaryToOct.put("111", "7");
binaryToOct.put("00", "0");
binaryToOct.put("10", "1");
binaryToOct.put("01", "2");
binaryToOct.put("11", "3");
binaryToOct.put("0", "0");
binaryToOct.put("1", "1");
}
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
scanner.nextLine();
for(int i = 0; i < n; i++) {
System.out.println(toOct(toBinary(scanner.nextLine())));
}
}
private static String toBinary(String s) {
StringBuilder result = new StringBuilder();
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(c >= 'A' && c <= 'F') {
result.append(hexToBinary[c - 'A' + 10]);
}else {
result.append(hexToBinary[c - '0']);
}
}
while(result.charAt(0) == '0') { //删除前导0
result.deleteCharAt(0);
}
return result.toString();
}
private static String toOct(String s) {
StringBuilder result = new StringBuilder();
StringBuilder input = new StringBuilder(s);
input.reverse();
for(int i = 0; i < input.length(); i += 3) {
result.append(binaryToOct.get(input.substring(i, Math.min(i + 3, input.length()))));
}
return result.reverse().toString();
}
}
JAVA解题报告: