问的问题很少,上来一道算法一道场景题,八股问的也不深,可惜鼠鼠忘了最左前缀法则捏
先做题(40分钟)
第一题是个算法题
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。
示例 1:
输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。
示例 2:
输入:nums = [0,1]
输出:2
解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。
示例 3:
输入:nums = [9,6,4,2,3,5,7,0,1]
输出:8
解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。
示例 4:
输入:nums = [0]
输出:1
解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。
提示:
n == nums.length
1 <= n<= 104
0 <= nums[i] <= n
nums 中的所有数字都 独一无二
进阶:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?
第一眼想了个数学方法
public static int findNotIn(int[] nums){
int sum=0;
int n=nums.length;
for(int i=0;i<n;i++){
sum+=nums[i];
}
int qsum=(1+n)*n/2;
return qsum-sum;
}
然后惊讶的发现这和力扣不同,需要自己处理输入输出(事后复盘,可以询问面试官可不可以用idea写)
弄了一会发现不会弄,于是想做出第二个方法将功补过
想到今天早上才刷的一道,和这道题很相似的,是找多余元素,于是想到用异或
public static int findNotInT(int[] nums){
//利用异或的性质,两次异或,没出现的元素只异或了奇数次,其他偶数次异或都为0,0与任何数异或都为原数
int i=0;
int n=nums.length;
for(int j=0;i<n;i++){
i^=j;
}
for(int j=0;j<n;j++){
i^=nums[j];
}
return i;
}
最后面试官问有没有其他方法,想了会,想了第三种方法,但是没写,只口述了思路:
开一个int[n+1]的数组array,初始全赋为-1,遍历nums,将nums[i]赋值给array[nums[i]],再遍历,arry[i]!=i即为所求
然后是场景题,说实话没怎么看懂,好像是高并发下只能有一个线程工作,这个线程工作结束后要把结果告知其他线程
现在有一个提供给客户端拉取信息的后台接口如下:
// 获取企业配置信息
message GetCorpConfigReq
{
optional uint64 corpid = 1; // 唯一标识一个企业
}
int GetCorpConfig(const GetCorpConfigReq &req, GetCorpConfigRsp &rsp)
{ // 假设这里只做简单的转发,具体逻辑由后端模块CorpConfigServer来完成,这里是一个rpc
int ret = CorpConfigServer().GetCorpConfig(req, rsp);
return ret;
}
在企业级应用的场景下,有些企业员工数高达几十万上百万,当企业信息更新时,如果所有员工都同时来拉取企业配置信息,将占用大量的资源。
请你帮忙设计一个防并发组件,当同一个后台进程收到同个corpid的多个GetCorpConfig请求时(多线程环境),只有一个请求会真实发起rpc来请求后端CorpConfigServer的接口获取数据,其余请求则挂起等待该请求返回结果后直接使用/共享该结果。注意,这个共享的结果在使用完应该被释放/销毁,后续不在当前并发范围内(即,真正发起rpc的那个请求从发起rpc到rpc返回结果的这段时间内)的请求不应该继续使用它。
相关标准库的用法允许查阅相关资料,尽量写,时间不够伪代码也行,不需要运行
想到了分布式锁,用Redis来做的,写了些java代码,写完后一直被面试官拷打,问我为什么要用分布式锁、先释放锁还是先将结果通知其他线程......
然后就是对着简历问,讲了一下项目,就开始问八股了
- 索引底层,B+树,对比了红黑树、二叉树、B树
- 最左索引法则,忘了啊啊啊啊啊,面试官后来出了一个场景
字段
a 1
b 2
c 3
索引
2 3
b c
问下面这些例子走索引没,怎么走的
c == xxx
b == x & a = y
c == x & b &== y
因为最近没复习Mysql,这块忘了,答的不好,感觉很可惜
-最后问了下java中并发的map(对,说的就是你,concurrentHashMap),问了下底层怎么实现的,问了下段所实现时的并发度
这是鼠鼠第一次面大厂,之前一直听人说wxg上来就是四道算法,怎么怎么难,一开始面试还很紧张,但后面也就逐渐放松了下来,有些八股没答对还是很可惜的,听说这是kpi面,但对我来说这也是一次宝贵的经验吧