当前位置: 首页 > 面试经验 >

WXG企微后端一面

优质
小牛编辑
88浏览
2024-03-06

WXG企微后端一面

问的问题很少,上来一道算法一道场景题,八股问的也不深,可惜鼠鼠忘了最左前缀法则捏

先做题(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&lt;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&lt;n;i++){

i^=j;

}

for(int j=0;j&lt;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面,但对我来说这也是一次宝贵的经验吧

 类似资料: