「这是我参与2022首次更文挑战的第32天,活动详情查看:2022首次更文挑战」。
导读
在刚刚结束的 每日算法&面试题,大厂特训二十八天 和 冲刺大厂每日算法&面试题,动态规划21天 的训练中我们一起打卡走了过来。但是学习不能停呀,从今天开始我们开始Java集训(算法&&面试题)第一天接着卷起来。
Java蓝桥集训
问题描述 给定n个十六进制正整数,输出它们对应的八进制数。
输入格式 输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由0
9、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式 输出n行,每行为输入对应的八进制正整数。
【注意】 输入的十六进制数不会有前导0,比如012A。 输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
解一:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] sts = new String[n];
for(int i=0;i<n;i++){
sts[i] = sc.next();
}
sc.close();
for(int i=0;i<n;i++){
String strBinary = toBinary(sts[i]);
int len_strBin = strBinary.length();
if(len_strBin%3==1) strBinary = "00"+strBinary;
if(len_strBin%3==2) strBinary = "0"+strBinary;
String strOctal = toOctal(strBinary);
System.out.println(strOctal);
}
}
private static String toOctal(String strBinary) {
int len = strBinary.length();
int k;
StringBuffer stb = new StringBuffer();
if(strBinary.substring(0, 3).equals("000"))
k=3;
else
k=0;
for(int i=k;i<len-2;i+=3){
switch (strBinary.substring(i, i+3)) {
case "000":stb.append("0");break;
case "001":stb.append("1");break;
case "010":stb.append("2");break;
case "011":stb.append("3");break;
case "100":stb.append("4");break;
case "101":stb.append("5");break;
case "110":stb.append("6");break;
case "111":stb.append("7");break;
default:break;
}
}
return stb.toString();
}
private static String toBinary(String strHex) {
int len_str = strHex.length();
StringBuffer stb = new StringBuffer();
for(int i=0;i<len_str;i++){
switch (strHex.charAt(i)) {
case '0':stb.append("0000");break;
case '1':stb.append("0001");break;
case '2':stb.append("0010");break;
case '3':stb.append("0011");break;
case '4':stb.append("0100");break;
case '5':stb.append("0101");break;
case '6':stb.append("0110");break;
case '7':stb.append("0111");break;
case '8':stb.append("1000");break;
case '9':stb.append("1001");break;
case 'A':stb.append("1010");break;
case 'B':stb.append("1011");break;
case 'C':stb.append("1100");break;
case 'D':stb.append("1101");break;
case 'E':stb.append("1110");break;
case 'F':stb.append("1111");break;
default:break;
}
}
return stb.toString();
}
}
解二:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String[] nums=new String[n];
for(int i=0;i<n;i++) {
nums[i]=sc.next();
}
sc.close();
for(String i:nums) {
System.out.println(String.format("%o", Integer.parseInt(i.trim(), 16)));
}
}
}
问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。 注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String n=sc.next();
sc.close();
System.out.println(Long.parseLong(n, 16));
}
}
面试题
谈谈你对解析与分派的认识。
解析指方法在运行前,即编译期间就可知的,有一个确定的版本,运行期间也不会改变。解析
是静态的,在类加载的解析阶段就可将符号引用转变成直接引用。
分派可分为静态分派和动态分派,重载属于静态分派,覆盖属于动态分派。静态分派是指在
重载时通过参数的静态类型而非实际类型作为判断依据,在编译阶段,编译器可根据参数的静
态类型决定使用哪一个重载版本。动态分派则需要根据实际类型来调用相应的方法。
修改对象 A 的 equals 方法的签名,那么使用 HashMap 存放这个对象实例
的时候,会用哪个 equals 方法?
会调用对象对象的 equals 方法。
“==”如果是基本类型的话就是看他们的数据值是否相等就可以。 如果是引用类型的话,比
较的是栈内存局部变量表中指向堆内存中的指针的值是否相等。 “equals”如果对象的
equals 方法没有重写的话,equals 方法和“==”是同一种。hashcod 是返回对象实例内存
地址的 hash 映射。 理论上所有对象的 hash 映射都是不