蓝桥集训(附加面试题)第二天

154 阅读3分钟

「这是我参与2022首次更文挑战的第32天,活动详情查看:2022首次更文挑战」。

导读

在这里插入图片描述

在刚刚结束的 每日算法&面试题,大厂特训二十八天冲刺大厂每日算法&面试题,动态规划21天 的训练中我们一起打卡走了过来。但是学习不能停呀,从今天开始我们开始Java集训(算法&&面试题)第一天接着卷起来。

Java蓝桥集训

问题描述   给定n个十六进制正整数,输出它们对应的八进制数。

输入格式   输入的第一行为一个正整数n (1<=n<=10)。   接下来n行,每行一个由09、大写字母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 映射都是不