算法会超时...但代码以及思路应该没错(16进制转化2进制再转化8进制)
错误原因
1、循环次数过多
2、switch语句使用过多
3、substring(0,3)这个只含开头不含结尾,因此截取是截取三个字符,从第一个到第三个字符,不包含第四个。
import java.util.*;
public class Main{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
String[] res = new String[n];
for(int i=0;i<n;i++)
{
String temp = sc.nextLine();
char[] n16_temp = new char[temp.length()];
String[] n2 = new String[temp.length()];
for(int j=0;j<temp.length();j++)
{
n16_temp[j]=temp.charAt(j); //n16_temp[j]=temp.charAt(j)+"";意味着n16得是字符串数组
//n16[j]=n16_temp[j]-'0'; //
switch(n16_temp[j])
{
case '0':
n2[j] = "0000";
break;
case '1':
n2[j] = "0001"; //单引号和双引号,一般是区别字符和字符串,但是字符串也能是1个甚至0个字符
break;
case '2':
n2[j] = "0010";
break;
case '3':
n2[j] = "0011";
break;
case '4':
n2[j] = "0100";
break;
case '5':
n2[j] = "0101";
break;
case '6':
n2[j] = "0110";
break;
case '7':
n2[j] = "0111";
break;
case '8':
n2[j] = "1000";
break;
case '9':
n2[j] = "1001";
break;
case 'A':
n2[j] = "1010";
break;
case 'B':
n2[j] = "1011";
break;
case 'C':
n2[j] = "1100";
break;
case 'D':
n2[j] = "1101";
break;
case 'E':
n2[j] = "1110";
break;
case 'F':
n2[j] = "1111";
break;
}
}
if(4*temp.length()%3 != 0)
{
String temp_0 = new String();
int s=4*temp.length()%3;
switch(s)
{
case 1:
temp_0 = "00" + n2[0];
n2[0] = temp_0;
break;
case 2:
temp_0 = "0" + n2[0];
n2[0] = temp_0;
break;
}
}
int num_8 = 4*temp.length()/3;
if(4*temp.length()%3 != 0) {num_8++; }
String[] n8 = new String[num_8];
String n8_temp=Arrays.toString(n2);
char[] f = new char[num_8];
for(int z=0,m1=0,m2=2;z<num_8;z++)
{
n8[z] = n8_temp.substring(m1,m2);
m1=m1+3;
m2=m2+3;
switch(n8[z])
{
case "000":
f[z] = '0';
break;
case "001":
f[z] = '1';
break;
case "010":
f[z] = '2';
break;
case "011":
f[z] = '3';
break;
case "100":
f[z] = '4';
break;
case "101":
f[z] = '5';
break;
case "110":
f[z] = '6';
break;
case "111":
f[z] = '7';
break;
}
res[i] = Arrays.toString(f);
}
}
for(int i=0;i<n;i++)
System.out.println(res[i]);
}
}