Java经典笔试题—day11

🔎选择题

(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


🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值