努力经营当下,直至未来明朗!
普通小孩也要热爱生活!
一、选择
- 下面哪个标识符是合法的?
A 9HelloWorld
B _Hello World
C Hello*World
D Hello$World
- Java中的集合类包括ArrayList、LinkedList、HashMap等类,下列关于集合类描述错误的是()
A ArrayList和LinkedList均实现了List接口
B ArrayList的访问速度比LinkedList快
C 添加和删除元素时,ArrayList的表现更佳
D HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值
- 以下描述正确的是
A CallableStatement是PreparedStatement的父接口
B PreparedStatement是CallableStatement的父接口
C CallableStatement是Statement的父接口
D PreparedStatement是Statement的父接口
- 下列关于容器集合类的说法正确的是?
A LinkedList继承自List
B AbstractSet继承自Set
C HashSet继承自AbstractSet
D WeakMap继承自HashMap
- ArrayList list = new ArrayList(20);中的list扩充几次()
A 0
B 1
C 2
D 3
二、编程
1. 最近公共祖先
将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法, 返回a、b最近的公共祖先的编号。 注意其祖先也可能是结点本身。
★2. 求最大连续bit数
求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1。
① 数据范围:数据组数:1≤t≤5 ,1≤n≤500000
② 进阶:时间复杂度:O(logn) ,空间复杂度:O(1)
答案
1. 选择
- 标识符的命名规则:
① 标识符中可以包含:字母、数字以及 下划线和 $ 符号等等。
② 注意:标识符不能以数字开头,也不能是关键字,且严格区分大小写。
故:选D
- ① map中key是唯一的,value可以重复。
② TreeMap中参数不可以是null(要进行比较),但是HashMap中key、value都可以是null。
③ Set值存储了key,一定要唯一。
④ set的底层是map实现的,最大的功能就是可以去重。
⑤ set的key不能直接修改,想要修改只能先删除然后再添加。
⑥ ArrayList具备随机访问能力(下标访问),所以一般说访问速度较快;而LinkedList增删查改能力一般会说较快些。
参考:Map和Set、 补充:LinkedList和ArrayList
故:选C
- 关于Statement的继承关系图:
① PreparedStatement是CallableStatement的父接口
② Statement是CallableStatement的父接口
③ Statement是PreparedStatement的父接口
故:选B
- 注意java集合框架:
① LinkedList是类,其是实现了List接口,而不是继承。
② AbstractSet类是实现了实现了Set接口
③ HashSet类继承 AbstractSet类,同时也实现set接口
④ WeakMap不存在于java集合框架的,只有一个叫做WeakHashMap(继承自AbstractMap类)
故:选C
- ① 如果直接指定大小,创建时直接分配该大小的空间,不需要扩容。
② 当需要进行扩容的时候,首先是预估进行1.5倍扩容;
③ 如果实际扩容空间超过1.5倍则按照实际大小类进行扩容;
④ 要检查扩容能否成功,防止太大导致扩容失败
故:选A
2. 编程
- 最近公共祖先
1)相关介绍:
① 满二叉树:一棵二叉树,如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树。也就是说,如果一棵二叉树的层数为K,且结点总数是 (2^k -1) ,则它就是满二叉树。
② 完全二叉树就是按顺序来的,中间没有空着的节点。
③ 满二叉树是特殊的完全二叉树。
2)思路:
① 注意:二叉树已知父亲结点n 计算子结点:左子结点2*n,右子节点(2*n+1)
② 二叉树已知子结点n(无论左右子结点),其父亲结点是(n/2)。
③ 注意一点:本题中已知的两个结点并没有指明是兄弟结点,也可能是父子结点,所以要进行判断:相等则本身,不相等则先计算较大的节点的父节点然后进行比较并进行循环计算即可。
3)代码:
import java.util.*;
public class LCA {
public int getLCA(int a, int b) {
// write code here
// 首先进行判断是否相等,也就是循环的条件
while (a != b) {
// 序号大的先进行父亲结点的计算
if(a > b) {
a /= 2;
} else {
b /= 2;
}
}
// 这里说明 a==b,此时已经找到了父亲结点
return a;
}
}
- 最大连续bit数
1)思路:
① 注意获取整数n二进制第i位的计算方法:
(n>>i) & 1
② 如果1连续就进行++,如果不连续就停止累加并进行暂存;直到遇到下一个1再开始累加,然后进行比较取最大
2)代码:
// 二进制中连续1的最大个数
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int n = in.nextInt();
int count = 0; // 每次的连续1个数
int max = 0; // 最大连续1的个数
// 整型是32位
// 或者这里可以直接使用while(n!=0)的循环,n>>=1
// 然后直接(n&1==1)作为判断条件就行
for (int i = 0; i < 32; i++) {
if (((n>>i)&1) == 1) {
count++;
} else {
//max = ((max>count)?max:count);
// 或者直接使用Math.max函数
max = Math.max(max,count);
count = 0;
}
}
System.out.println(max);
}
}
}