下面是测试数据(这个数据太大了,感受数据支配的恐惧,导致常规方法行不通)
代码虽然多,但是可以看其思想,执行效率还是非常高的。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;
}
}