2023初级Java工程师面试题及答案

2023初级Java工程师面试题及答案

往期文章>>>
Java最全面试题【五分钟看完】
Java后端精选面试题分享
Java经典面试题 带答案(五)
Java经典面试题 带答案(四)
Java经典面试题 带答案(三)
2023年春招Java面试选择题及答案解析
2023饿了吗Java后端面经和网易Java面经【赶紧来试试!】

一、选择题

单选题

1、下面哪种是正确的创建Map集合的方式()

A、Map m=new Map();
B、Map m=new Map(init capacity, increment capacity);
C、Map m=new Map(new Collection());
D、Map是接口,所以不能实例化

正确答案:D

单选题

2、下面程序段运行结果是什么?()

int i=0;
int a[]={3,6,4,8,5,6};
do{
a[i]-=3;
}while(a[i++]<4);
for(i=0;i<6;i++)
{
printf("%d",a[i]);
}

A、31556
B、64856
C、31523
D、364856

正确答案:A

单选题

3、Linux系统中关于进程与线程的描述错误的是( )

A、进程是处于执行期的程序以及相关资源的总称
B、内核调度的对象是线程,而不是进程
C、当进程处于TASK_UNINTERRUPTIBLE状态时可以被杀死
D、线程被视为一个与其他进程共享某些资源的进程

正确答案:C

单选题
4、若变量已正确定义,要求程序段完成求5!的计算,不能完成此操作的程序段是( )
A、for(i=1,p=1;i<=5;i++) p*=i;
B、for(i=1;i<=5;i++){ p=1; p*=i;}
C、i=1;p=1;while(i<=5){p*=i; i++;}
D、i=1;p=1;do{p*=i; i++; }while(i<=5);

正确答案:B

单选题

5、初始化一个C程序二维数组代码如:

int a[3][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

请问 a[1][4] 的值为多少?()
A、4
B、9
C、10
D、11

正确答案:C

单选题

6、单向链表已经可以实现非连续存储,为什么还需要双向链表?()

A、双向链表更稳定
B、双向链表中的任意一个结点都可以直接访问前驱结点和后继结点
C、双向链表删除节点更方便
D、双向链表复杂度更低

正确答案:B

单选题

7、下面关于网络协议错误的是: ( )

A、传输控制协议(TCP),面向连接,提供可靠的数据传输。
B、用户数据报协议(UDP),无连接,提供不可靠的数据传输。
C、TCP和UDP协议都属于传输层协议。
D、Socket通信只能使用TCP协议进行通信。

正确答案:D

单选题

8、在一棵二叉树上第10层的节点数最多是()

A、128
B、256
C、512
D、1024

正确答案:C

单选题

9、关于进程内存空间描述错误的是?( )

A、函数参数,局部变量自动分配在栈上。
B、栈的空间大小是有限制的,当函数调用层次过深时会出现栈溢出。
C、在堆上分配的内存需要程序主动释放。
D、程序结束时,在堆上分配的没有释放的内存会造成泄漏。

正确答案:D

单选题

10、下面哪个操作系统不使用Linux内核 ? ( )

A、AndroiD、B、MacOS
C、Ubuntu
D、RedHat

正确答案:B

单选题

11、下面哪种情况不会触发进程调度?()

A、正在运行的进程所分配的时间片结束
B、正在运行的进程访问一个临界区时,保护此临界区的互斥信号量已经被其他进程加锁
C、当一个进程执行了一条转移指令后
D、当一个进程创建了一个新进程时

正确答案:C

多选题

12、在下列汇编指令的表示中,正确的是( )

A、MOV AL, [BX+SI+20]
B、DEC [BX]
C、XCHG VAL1, AX
D、SUB [BX],[BP][DI]

正确答案:ACD

多选题

13、下面关于C程序的存储空间,描述正确的是?()

A、局部变量存放在栈上
B、全局变量存放在数据段
C、静态变量存放在数据段
D、C++中new一个对象是从堆上分配内存的

正确答案:ABCD

多选题

14、希尔排序是1959年提出的一种排序算法,下列有关希尔排序描述正确的有哪些?()

A、希尔排序是插入排序的改进版本
B、希尔排序是冒泡排序的改进版本
C、增量的选择直接影响着排序的速度与效率
D、希尔排序是一种十分稳定的算法

正确答案:AC

多选题

15、关于下列代码描述正确的有哪些?()

void sort(vector<int>& nums)
{
for(int i=0;i<nums.size();i++)
for(int j=i;j<nums.size();j++)
{
if(nums[j]<nums[i])
{
int temp=nums[i];
nums[i]=nums[j];nums[j]=temp;
}
}
}

A、这是插入排序
B、这是冒泡排序
C、空间复杂度为O(1)
D、时间复杂度为O(n^2)

正确答案:BCD

多选题

16、下面关于文件系统,描述不正确的是?()

A、进程终止后,这个进程所打开的文件也会被系统删除
B、删除一个文件,同时会删除与此文件对应的文件控制块
C、一个文件在磁盘上存放的磁盘块必须是相邻的
D、符号连接所连接的文件被删除后,符号连接也会消失

正确答案:ACD

多选题

17、下面关于排序算法描述正确的是()

A、冒泡排序的最好情况和最坏情况时间复杂度一样
B、归并排序的最好情况和最坏情况时间复杂度一样
C、选择排序的最好情况和最坏情况时间复杂度不一样
D、直接插入排序的最好情况和最坏情况时间复杂度不一样

正确答案:BD

多选题

18、关于操作系统分段机制描述正确的是( )

A、数据段存放程序中的静态变量和已初始化且不为零的全局变量
B、代码段存放可执行文件的操作指令,代码段是只读的,不可进行写操作
C、BSS段( Block Started By Symbol):存放未初始化的全局变量,在变量使用前由运行时初始化为零
D、分段是为了提高内存利用率,减少内存碎片

正确答案:ABCD

多选题

19、关于以下说法错误的是()

A、数组逻辑上相邻的元素在物理存储位置上也相邻,而链表一定不相邻
B、链表的长度是按实际需要可以伸缩,而数组的长度是在定义时要给定
C、插入和删除时,数组平均需要移动n/2个元素,而链表只需修改指针即可
D、查找制定节点,数组和链表平均时间复杂度都为O(1)

正确答案:AD

多选题

20、关于虚拟内存的描述正确的是: ( )

A、虚拟内存是计算机系统内存管理的一种技术,使得应用程序认为它拥有连续可用的内存
B、虚拟内存使得多个应用程序之间切换会花费更少的时间
C、实现进程地址空间隔离
D、虚拟内存和物理内存的映射通过页表(page table)来实现

正确答案:ACD

多选题

21、如何撤销数据库中已经存在的表X

A、DELETE TABLE X
B、DELETE X
C、DROP X
D、DROP TABLE X

正确答案:D

多选题

22、项目表中虽然设置索引,但是效果不是很明显,问题可能是()

A、where中索引列有运算
B、OR语句前后有同时使用索引
C、复合索引未使用左列字段
D、没有以“%”开头的LIKE语句,模糊匹配

正确答案:AC

多选题

23、下列说法错误的有?

A、数组是一种对象
B、数组属于一种原生类
C、int number=[]={31,23,33,43,35,63}
D、数组的大小可以任意改变

正确答案:BCD

多选题

24、以下关于对象序列化描述正确的是?

A、使用FileOutputStream可以将对象进行传输
B、使用PrintWriter可以将对象进行传输
C、使用ObjectOutputStream类完成对象存储,使用ObjectInputStream类完成对象读取
D、对象序列化的所属类需要实现Serializable接口

正确答案:CD

多选题

25、关于同步异步,阻塞与非阻塞的说法, 以下正确的是

A、同步和异步关注的是消息通信机制
B、阻塞和非阻塞关注的是程序在等待调用结果时的状态
C、异步操作后, 可以不使用回调函数来获取操作结果
D、非阻塞操作, 必定是异步的

正确答案:ABCD

26、返回所有价格在 3美元到 6美元之间的产品的名称和价格

有表Products
在这里插入图片描述

【问题】编写 SQL 语句,返回所有价格在 3美元到 6美元之间的产品的名称(prod_name)和价格(prod_price),使用 AND操作符,然后按价格对结果进行升序排序
【示例结果】
返回商品名称prod_name和商品价格prod_price
prod_name
prod_price
egg	3
sockets	4

注:不需要考虑价格相同时的排序问题
A、select prod_name,prod_pricefrom Products where prod_price between 3 and 6 order by prod_price
B、select prod_name,prod_price from Products where prod_price between 3 and 6 order by prod_price desc
C、select * from Products where prod_price between 3 and 6 order by prod_price desc
D、select *from Products where prod_price < 3 and prod_price > 6 order by prod_price desc

正确答案:A

二、编程题

27、农场主大明开始用无人机给他的农田施肥,农田共有 nn 行,无人机携带了 mm 千克肥料。无人机的施肥方式为:

给第 11 行施 11 千克肥料;

给第 22 行施 11 千克肥料;

给第 n-1n−1 行施 11 千克肥料;

给第 nn 行施 11 千克肥料;

然后更改方向给第 n-1n−1 行施 11 千克肥料;

给第 n-2n−2 行施 11 千克肥料;

即每次给整个农田施一遍肥料,无人机就会自动更改方向继续施肥直到无人机携带的肥料用完位置。

现在大明想知道每行最终施了多少肥料。

函数传入两个正整数 nn 和 mm 分别代表农田的行数和无人机携带的肥料数,你需要返回一个数组,假设数组为 aa ,则 a_{i}a i​
表示第 i+1i+1 行农田被灌溉了 a_{i}a i
千克的肥料 (0 \leq i \leq n-1)(0≤i≤n−1) 。
(施肥前每一行都是0)

解析:找一下数学规律就行,在m足够大的情况下,我们先列出来看看:
第1趟施肥,可以影响第1行到第n行;
第2趟施肥,可以影响第n-1行到第1行;
第3趟施肥,可以影响第2行到第n行;
第4趟施肥,可以影响第1行到第n-1行;
第5趟施肥,可以影响第2行到第n行;
……
可以发现除了第1趟影响了第1n行,从第2趟开始,偶数趟都是影响前n-1行,奇数趟影响后n-1行。我们可以先不考虑余数(m-n)%(n-1),这时候除了第1趟施肥了n千克,中间的第2n-1行都可以施肥(m-n)/(n-1)千克,第1行和第n行可以施肥(m-n)/(n-1)/2千克。最后再根据(m-n)/(n-1)的奇偶性,来判断最后(m-n)%(n-1)千克的肥料应该施在哪些行。

import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @param m long长整型 
     * @return long长整型一维数组
     */
    public long[] FarmerNN (int n, long m) {
        // write code here
        long[] res = new long[n];
        if(m < n){
            for(int i = 0; i < m; i++){
                res[i]++;
            }
        }else{
            if(n == 2){
                if(((m - n) & 1) != 0){
                    res[0] = (m >> 1)|1;
                    res[1] = m >> 1;
                }else{
                    res[0] = m >> 1;
                    res[1] = res[0];
                }
            }else{
                Arrays.fill(res, 1);
                m -= n;
                long remain = m % (n - 1);
                long times = m / (n - 1);
                if(times > 0){
                    for(int i = 1; i < n - 1; i++){
                        res[i] += times;
                    }
                    res[0] += times >> 1;
                    res[n - 1] += times >> 1;
                }
                if((times & 1) == 0){
                    for(int i = n - 2; i >= n - 1 - remain; i--){
                        res[i]++;
                    }
                }else{
                    for(int i = 0; i <= remain; i++){
                        res[i]++;
                    }
                }
            }
        }
        return res;
    }
}

28、给出一个大小为n的数组a和整数t,定义区间l,r,若存在下标i,j(l<=i<j<=r)属于区间[l,r],且a[i]异或a[j]=t,那么称[l,r]是非奇特区间,如不存在,则[l,r]是奇特区间,求a数组里的奇特区间个数。

解析:先定义两个指针left和right,均从0开始,作为窗口的左右边界,记区间的左右边界为L和R。
遍历数组,扩张窗口的右边界,考察每个元素a[right]为区间右端点的情况。当右边界遍历到某个位置right时,累加a[right]的频数。
如果a[right]t在哈希表内,说明之前加入的数中存在一个数a[right]t,当它作为区间左边界元素时,在a[right]为区间右边界的情况下会造成a[L]a[R]=a[right]ta[right]=t,使得[L,R]为非奇特区间,此时开始收缩窗口的左边界,直到非奇特区间被排除在外,即a[right]t不在哈希表内。

如果a[right]^t不在哈希表内,说明[left,right]中都是奇特区间,在right为区间右端点的情况下,从left到right-1都可以作为区间的左端点形成奇特区间,此时有right-left个奇特区间产生,将其累加到奇特区间的总数上。

import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param a int整型一维数组 
     * @param t int整型 
     * @return long长整型
     */
    public long section (int[] a, int t) {
        // write code here
        int n = a.length;
        HashMap<Integer, Integer> counter = new HashMap<>();
        int left = 0, right = 0;
        long count = 0;
        while(right < n){
            counter.put(a[right], counter.getOrDefault(a[right], 0) + 1);
            while(counter.containsKey(a[right] ^ t)){
                // 收缩左边界
                if(counter.get(a[left]) == 1){
                    counter.remove(a[left]);
                }else{
                    counter.put(a[left], counter.get(a[left]) - 1);    // 排除一个能与a[right]异或得到t的值
                }
                left++;
            }
            count += right - left;
            // 扩张右边界
            right++;
        }
        return count;
    }
}

请添加图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程ID

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值