单选题不记得了,只记得8题24分,下面的题目答案是我自己做的,如果有错误评论或者私信我,我改正,希望能帮助到大家,要面试技巧和面经的也可以私信我。
目录
不定项选择题(12分):
知识点:栈和堆
1.假设一个栈,元素的输入序列为b,o,o,k,s。每个元素进栈后可以立即出栈,也可以不出栈,但最多隔三个元素就必须出战,那么可能的出栈序列有哪些情况?
A b.o,o,k,s
B b,o, k,o.s
C b,o,o,s,k
D b.o.s,o,k
栈的特点是后进先出(LIFO),即最后放入的元素最先被取出。所以单选D,s出栈说明栈内原先是sko,s所以出栈只能是bosko不可能是bosok。(大厂笔试我每次都能遇见这种题),单选题还问了最大堆和最小堆的排序问题,每次笔试都有,大家重点看看
知识点:完整性?
2.关于关系的完整性,以下哪些描述是正确的?
A实体完整性用于确保主键的唯一性
B参照完整性用于确保外键的有效性
C用户完整性用于确保用户的权限合法
D数据完整性用于确保数据的一致性
答案选ABD我选了C,漂亮,根本没见过的题型不知道在考啥都。
知识点:网络协议HTTP
3.以下哪些是HTTP控制缓存的响应头()
A ETag
B Last-Modified
C Cache-Control
D Expires
A.ETag - 这个响应头不是直接用于控制缓存的,而是用来标识资源的特定版本。ETag(Entity Tag)通常与Last-Modified头一起使用,用于在HTTP缓存中实现缓存验证。
B. Last-Modified - 这个响应头用于指示资源的最后修改时间。它通常与ETag一起使用,用于在HTTP缓存中实现缓存验证。
C. Cache-Control - 这个响应头是用于控制响应缓存的最重要的头之一。它提供了多种指令,如max-age、no-cache、no-store等,用于告诉浏览器如何缓存响应。
D. Expires - 这个响应头用于提供一个日期/时间,告诉浏览器在这个时间点之前可以直接从缓存中读取数据,而不需要再次请求服务器。
因此,正确的选项是 C 和 D。ETag 和 Last-Modified 通常用于缓存验证,而不是直接控制缓存行为。
我单选了C.这种协议也经常问,比如说传输层协议有哪些,多选题
知识点:设计模式
4.下面选项中的设计模式,不属于创建型模式的是()
A.观察者模式
B.原型模式
C.桥接模式
D.工厂方法模式
高频考点!!!设计模式!!!,我也每次都遇见。
答案AC,大家牢记下面的设计模式属于哪一类,以及什么时候用这个模式。我依稀记得单选题就问了一道业务场景题,问用户可以选择微信、支付宝、银行卡不同的支付方式,用什么设计模式?
我选了策略模式
思维导图是大佬整理的,右下角有水印可见
算法题(55分):
一共有三道题
签到题1
小红定义一个数组的权值为:正数的元素数量减去负数的元素数量。例如,[1,2,-3,-4,5]的权值是1,[-2,-5]的权值是-2.
现在小红拿到了一个数组,她准备选择恰好k个元素进行取反(同一个元素最多只能取反一次),之后使得数组的权值尽可能大。你能帮帮她吗?
输入描述
第一行输入两个正整数n,k,代表小红拿到的数组和选择的元素数量。
第二行输入n个整数ai,用空格隔开。代表小红拿到的数组。
1 ≤k≤n≤ 10^5
-10^9 ≤ ai ≤ 10^9
输出描述
一个整数,代表操作后数组权值的最大值。
示例1
输入示例:
5 3
3 2 -1 5 -2
输出示例:
3
签到题还是蛮简单的,我的思路如下:
这题分两种情况
1.k<负数的数量,那么就是反转全部负数,记录正数的数量+2*k-负数的数量
2.k>负数的数量,那么就是反转完负数,然后反转0,最后反转正数
特别注意:0不是正数也不是负数,所以说我们要记录原先数组的正数数量,负数数量,和0的数量
最后签到题也是全部通过测试案例了。
算法题2
小红要识别*号组成的图像是L还是T,图像由二维数组组成,L和T会旋转,请你帮他判断
第一行输入n,k表示二维数组行列
后面是n行k列的二位数组
输入案例:
4 4
..*.
..*.
..*.
***.
输出案例
L
我的思路:
我把输入转换成01矩阵,.是0,*是1。然后以第一个*号出现的位置为起点,转换成走迷宫问题,如果有分岔路就是T,如果没有分岔路就是L。
第一个*号就是右上角的第一个,然后进行深度优先(广度优先也一样的)遍历,看上下左右四个方位有没有能走的点(记得加上边界条件判断,不然数组越界)。
第一个点有两种情况:
1.如果第一个点的右边和下边都是1,那么就是L。(可以画图理解一下,不可能是T)
2.如果只有一边能走,就开始遍历,每走一步都判断一下其他方位有没有可达的点。
如果可达点位是3那么就返回T,否则当没有可达的点时停止循环,返回L。
然后我只通过了10%的 测试样例,哭了。大佬们看看思路哪里有问题。(我感觉这题我随机random返回T和L,多提交几次正确率都比我自己写的高) /(ㄒoㄒ)/~~
算法题3
我都没写到,就到时间自动交卷了,第二题搞半天还是10%
小红拿到了一个数组,数组的元素的绝对值不超过1,她想取一个非空子序列(在原数组中可以不连续),并计算该子序列的乘积。小红想知道,子序列乘积为 -1、0、1 的方案数分别有多少种?输入描述 第一行输入一个正整数n,代表数组的大小。第二行输入n个整数a[n];,代表数组的元素, 1≤n≤ 10^5 -1<ai <1输出描述 三个整数,分别代表子序列乘积为负数、0、正数的方案数。由于答案可能过大,请对10^9+7取模。
我的思路:很明显动态规划的题目(也是必考)
我们创建动态规划的状态转移方程,在当前子序列的情况下,增加一个新的元素有三种可能,-1,0,1,那么对应的三个子序列方案数也要变化。
我们可以定义三个变量来分别存储乘积为 -1、0、1 的子序列方案数:
neg
表示乘积为 -1 的子序列方案数。zero
表示乘积为 0 的子序列方案数。pos
表示乘积为 1 的子序列方案数。
接下来,我们逐步遍历数组,根据当前元素的值更新这三个变量。
-
如果当前元素是 -1,那么:
neg
增加pos + zero
(因为乘以 -1 后,1 变 -1,0 保持 0)。pos
增加zero
(因为乘以 -1 后,0 变 1)。
-
如果当前元素是 0,那么:
zero
重置为pos + neg + zero
(因为任何数乘以 0 都是 0)。
-
如果当前元素是 1,那么:
pos
增加pos + zero
(因为乘以 1 后,保持不变)。
状态转移方程: 对于每个元素 a[i]
(i
从 1 到 n
),我们有:
-
如果
a[i] == -1
:neg[i] = (neg[i-1] + zero[i-1] + pos[i-1]) % MOD
zero[i] = (pos[i-1] + neg[i-1]) % MOD
pos[i] = (pos[i-1] + zero[i-1]) % MOD
-
如果
a[i] == 0
:neg[i] = 0
zero[i] = (neg[i-1] + zero[i-1] + pos[i-1]) % MOD
pos[i] = zero[i-1]
-
如果
a[i] == 1
:neg[i] = neg[i-1]
zero[i] = zero[i-1]
pos[i] = (pos[i-1] + zero[i-1]) % MOD
别认真看了,我要是会,第二题早写出来了/(ㄒoㄒ)/~~
大家加油吧,希望有一天能在大厂遇见各位
http://t.csdnimg.cn/gQS5vhttp://t.csdnimg.cn/gQS5v这也是大厂的笔试题,感兴趣的可以做做看
下面还有面试的小技巧,我面试5家拿了四家offer,这些技巧很关键,我八股都没怎么背,只背了很小一部分
http://t.csdnimg.cn/Dnb5qhttp://t.csdnimg.cn/Dnb5q
要大厂java面试宝典的也可以私信我,发"大厂java面试宝典"