2023初级Java工程师面试题及答案
- 一、选择题
- 1、下面哪种是正确的创建Map集合的方式()
- 2、下面程序段运行结果是什么?()
- 3、Linux系统中关于进程与线程的描述错误的是( )
- 5、初始化一个C程序二维数组代码如:
- 6、单向链表已经可以实现非连续存储,为什么还需要双向链表?()
- 7、下面关于网络协议错误的是: ( )
- 8、在一棵二叉树上第10层的节点数最多是()
- 9、关于进程内存空间描述错误的是?( )
- 10、下面哪个操作系统不使用Linux内核 ? ( )
- 11、下面哪种情况不会触发进程调度?()
- 12、在下列汇编指令的表示中,正确的是( )
- 13、下面关于C程序的存储空间,描述正确的是?()
- 14、希尔排序是1959年提出的一种排序算法,下列有关希尔排序描述正确的有哪些?()
- 15、关于下列代码描述正确的有哪些?()
- 16、下面关于文件系统,描述不正确的是?()
- 17、下面关于排序算法描述正确的是()
- 18、关于操作系统分段机制描述正确的是( )
- 19、关于以下说法错误的是()
- 20、关于虚拟内存的描述正确的是: ( )
- 21、如何撤销数据库中已经存在的表X
- 22、项目表中虽然设置索引,但是效果不是很明显,问题可能是()
- 23、下列说法错误的有?
- 24、以下关于对象序列化描述正确的是?
- 25、关于同步异步,阻塞与非阻塞的说法, 以下正确的是
- 26、返回所有价格在 3美元到 6美元之间的产品的名称和价格
- 二、编程题
往期文章>>>
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
注:不需要考虑价格相同时的排序问题
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;
}
}