1. 下面哪个标识符是合法的?
A 9HelloWorld
B _Hello World
C Hello*World
D Hello$World
答案
D
解析:
2. 以下java程序代码,执行后的结果是()
- java.util.HashMap map=new java.util.HashMap();
- map.put("name",null);
- map.put("name","Jack");
- System.out.println(map.size());
A 0
B null
C 1
D 2
答案
C
解析:map.size()
返回 map 中元素的数量
3. Java中的集合类包括ArrayList、LinkedList、HashMap等类,下列关于集合类描述错误的是
A ArrayList和LinkedList均实现了List接口
B ArrayList的访问速度比LinkedList快
C 添加和删除元素时,ArrayList的表现更佳
D HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值
答案
C
解析:
ArrayList 插入和现有项的删除开销很大时间复杂度 O(n),除非在尾部 O(1)
LinkedList 插入和删除开销很小 时间复杂度 O(n),头部和尾部 O(1)
HashMap可以用null值和空字符串作为K,不过只能有一个
4. 以下描述正确的是
A CallableStatement是PreparedStatement的父接口
B PreparedStatement是CallableStatement的父接口
C CallableStatement是Statement的父接口
D PreparedStatement是Statement的父接口
答案
B
解析:
PreparedStatement 继承 Statement,CallableStatement 继承 PreparedStatement
PreparedStatemen 是用来执行sql语句的与创建Statement不
5. 下面有关重载函数的说法中正确的是
A 重载函数必须具有不同的返回值类型
B 重载函数形参个数必须不同
C 重载函数必须有不同的形参列表
D 重载函数名可以不同
答案
C
6. 下列关于容器集合类的说法正确的是?
A LinkedList继承自List
B AbstractSet继承自Set
C HashSet继承自AbstractSet
D WeakMap继承自HashMap
答案
C
解析:
LinkedList 实现 List 接口
AbstractSet 实现 Set 接口
7. ArrayList list = new ArrayList(20);中的list扩充几次
A 0
B 1
C 2
D 3
答案
A
解析:
调用的是第三个构造函数,直接初始化为大小为20的list,没有扩容,所以选择A
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
解析:输出 str 和 ch,此时 str 还是指向 "good" 的,ch 还是指向之前的数组,但是数组内容已经被改变, str 是按值传递的,而 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
解析:case 2、3 都没有 break,所以 2、3 都会进。
10. 提供Java存取数据库能力的包是( )
A java.sql
B java.awt
C java.lang
D java.swing
答案
A
解析:
A java.sql 包提供Java存取数据库能力
B java.awt 包是java图形界面的包
C java.lang 是java语言的核心好,lang是language的简写
D java.swing 是经过java封装的与操作系统无关的图形界面包
1. 完善核心代码 标题:最近公共祖先 | 时间限制:3秒 | 内存限制:32768K | 语言限制:[Python, C++,
C#, Java]
将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。 设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。
测试样例:
2,3
返回:1
答案
满二叉树的子节点与父节点之间的关系为 root = child / 2,利用这个关系,如果 a != b,就让其中的较大数除以2, 如此循环直到 a == b。满二叉图,如下图所示
- import java.util.*;
-
- public class LCA {
- public int getLCA(int a, int b) {
- while(a != b){
- if(a > b){
- a /= 2;
- }else {
- b /= 2;
- }
- }
- return a;
- }
- }
2. ACM编程题 标题:求最大连续bit数 | 时间限制:1秒 | 内存限制:32768K
求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
数据范围:数据组数: 1≤t≤5 , 1≤n≤500000
进阶:时间复杂度: O(logn) ,空间复杂度: O(1)
输入描述:
输入一个int类型数字
输出描述:
输出转成二进制之后连续1的个数
示例1:
输入
200
输出
2
说明
200的二进制表示是11001000,最多有2个连续的1。
答案
方法 1: Java 直接用位运算符 &,用当前数字和 1 做“&”操作,如果结果是1,说明此时的二进制第一位为1,然后右移一位,直至数字为0。
注意java的 >>
是有符号右移,也就是说,负数用 >>
右移的话,会在左侧补1而不是0,这就会影响最终对1的计数。所以这里我们要使用无符号右移 >>>
。
- import java.util.Scanner;
-
- public class Main {
- public static void main(String[] args) {
- // 用位运算符& 1&1 = 1 一位一位的与1比较,比较后将n右1位
- Scanner in = new Scanner(System.in);
- int n = in.nextInt();
- int count = 0;
- int max = 0;
- while( n != 0){
- if( (n & 1) == 1){
- count ++;
- max = Math.max(max,count);
- }else{
- count = 0;
- }
- n >>>= 1;
- }
- System.out.print(max);
- }
- }
方法 2:将数字转为二进制字符串,再将二进制字符串按 "0" 分割
- 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();
- // 转为二进制字符串
- String binaryStr = Integer.toBinaryString(n);
- // 分割
- String[] str = binaryStr.split("0");
- int max = 0;
- for(int i = 0; i < str.length;i++ ){
- if(str[i].length() > max){
- max = str[i].length();
- }
- }
- System.out.print(max);
- }
- }
- }