Java经典笔试题—day11
- 🔎选择题
- 🔎编程题
- 🥝最近公共祖先
- 🥝最大连续bit数
- 🔎结尾
🔎选择题
(1)下面哪个标识符是合法的?
A.9HelloWorld
B._Hello World
C.Hello*World
D.Hello$World
D
Java中标识符由数字, 字母和下划线( _ ), 美元符号( $ )或人民币符号( ¥ )组成
规定标识符的开头不能是数字, 且标识符不能是关键字
(2)以下java程序代码,执行后的结果是()
java.util.*
HashMap<String, String> map = new HashMap<>();
map.put("name",null);
map.put("name","Jack");
System.out.println(map.size());
A.0
B.null
C.1
D.2
C
map 会将重复出现的 Key 值所对应的 Value 值进行更新
map.put(“name”,null), map 中存放的 Key 值为 name, Value 值为 null
map.put(“name”,“Jack”), map 中已经含有 name, 将其所对应的 Value 值进行更新为 Jack
此时 map 的大小仍然为 1
(3)Java中的集合类包括ArrayList、LinkedList、HashMap等类,下列关于集合类描述错误的是()
A.ArrayList和LinkedList均实现了List接口
B.ArrayList的访问速度比LinkedList快
C.添加和删除元素时,ArrayList的表现更佳
D.HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值
C
A.
图片来自网络
B.ArrayList 是顺序表(数组实现), LinkedList 是链表, 在给定下标的情况下, 顺序表的访问速度 > 链表的访问速度
C.
添加元素时, 如果不是在末尾添加元素, 顺序表需要将要添加元素的位置及其后面的位置挪开, 然后才能添加元素
删除元素时, 顺序表需要将要删除元素的后面的元素逐个向前挪动一位(覆盖前一位置的元素)
对于链表, 添加元素只需将前后两个节点之间断开, 并分别连接需要添加元素的节点即可
对于链表, 删除元素只需将要删除元素的前后节点与该节点断开连接, 再将前后节点进行连接即可
D.HashMap实现Map接口,允许将null用作键或值
(4)以下描述正确的是 ( )
A.CallableStatement是PreparedStatement的父接口
B.PreparedStatement是CallableStatement的父接口
C.CallableStatement是Statement的父接口
D.PreparedStatement是Statement的父接口
B
PreparedStatement是CallableStatement的父接口
Statement是PreparedStatement的父接口
(5)下面有关重载函数的说法中正确的是()
A.重载函数必须具有不同的返回值类型
B.重载函数形参个数必须不同
C.重载函数必须有不同的形参列表
D.重载函数名可以不同
C
重载的特点
- 方法名相同
- 参数列表不同(参数类型, 顺序, 个数)
(6)下列关于容器集合类的说法正确的是?
A.LinkedList继承自List
B.AbstractSet继承自Set
C.HashSet继承自AbstractSet
D.WeakMap继承自HashMap
C
图片来自网络
A. List 是接口, 接口是被实现, 不是继承
B. Set 是接口, 接口是被实现, 不是继承
C.
D.
(7)ArrayList list = new ArrayList(20);中的list扩充几次 ( )
A.0
B.1
C.2
D.3
A
此处写入的 20 表示初始化容量为 20
若什么都不写, 则使用系统默认的容量 10
参考 ArrayList 源码
初始化容量 > 0, new Object 数组, 该操作并未涉及到扩容
(8)以下程序的输出结果是?
public class Example {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };
public static void main(String args[]) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
}
public static void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'g';
}
}
A.good and abc
B.good and gbc
C.test ok and abc
D.test ok and gbc
B
change() 方法是引用传递
进入 change() 方法的形参 str 最初指向的是 “good” 的地址
当执行到 str = “test ok” 时, 形参 str 指向的是 “test ok” 的地址
而实参 str 仍然指向的是 “good” 的地址
ch[0] = ‘g’ 是将 ch 所指向地址的值进行了修改, 即 char[] ch = {‘g’, ‘b’, ‘c’}
但 ch 所指向的对象未发生改变
(9)下面的方法,当输入为2的时候返回值是多少?
public static int getValue(int i) {
int result = 0;
switch (i) {
case 1:
result = result + i;
case 2:
result = result + i * 2;
case 3:
result = result + i * 3;
}
return result;
}
A.0
B.2
C.4
D.10
D
(10)提供Java存取数据库能力的包是( )
A.java.sql
B.java.awt
C.java.lang
D.java.swing
A
B.包含用于创建用户界面和绘制图形图像的所有分类
C.提供了 Java 中的基础类, 包括基本Object类, Class类, String类, 基本类型的包装类, 基本的数学类等等最基本的类
D.是一个用于开发Java应用程序用户界面的开发工具包
🔎编程题
🥝最近公共祖先
题目描述
将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身
解题思路
以该图为例
- 因为根节点为 1, 所以子节点 = 父节点 / 2
- 当a, b 为同一节点时, 其最近公共祖先就是自己
- 当a, b 在同一侧时
- a = 2,b = 4, 最近公共祖先为2
- a = 4, b = 5, 最近公共祖先为2
- 当a, b 不在同一侧时
- a = 2, b = 3, 最近公共祖先为1
根据上面的信息, 我们需要判断a, b 节点中较大的节点
通过较大的节点 / 2, 得到该节点的父节点, 并判断父节点是否与a, b 中较小的节点相等
如果相等, 则该节点即为最近公共祖先
如果不等, 则继续下一轮循环
public static int getLCA(int a, int b) {
// write code here
while(a != b) {
if(a > b) {
a /= 2;
} else {
b /= 2;
}
}
return a;
}
📢题目链接
链接: link
🥝最大连续bit数
题目描述
求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
数据范围:数据组数:1≤t≤5 ,1≤n≤500000
进阶:时间复杂度:O(logn) ,空间复杂度:O(1)
输入描述
输入一个int类型数字
输出描述
输出转成二进制之后连续1的个数
解题思路
枚举
枚举输入数字的连续1的个数, 记录为 count
当前位的数字不是1时, 比较 count 和 maxCount 中的较大值赋值给 maxCount
//最大连续bit数
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
int maxCount = getMAX(num);
System.out.println(maxCount);
}
private static int getMAX(int num) {
int maxCount = 0,count = 0;
for (int i = 31; i >= 0; i--) {
if((num & (1 << i)) != 0) {
count++;
} else {
maxCount = Math.max(maxCount,count);
count = 0;
}
}
return Math.max(maxCount, count);
}
}
📢题目链接
链接: link
🔎结尾
创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油