小红书杀疯了!现在想进小红书,都会被问到哪些内容?
大家好,我是土哥,一位被大数据开发耽误的歌手。
这两天,小红书的程序员们怕是夜不能寐,白天维护国内环境稳定,到了晚上还得陪着众多漂亮国的网友。
这事说来话长,咱们长话短说。
由于 TikTok 在美国即将面临禁令,许多美国用户为了避免 Tiktok 被封掉导致账户无法使用,因此他们转向了其他中国社交媒体平台,如小红书, 同时自称为:TikTok Refugee ~
这下可不得了了,这两天直接在 APP Store 上面把小红书的下载量干到了第一。
打开小红书,你会发现,全都是外国网友,一个个点赞,评论非常多,我都以为自己在使用国外软件,哈哈。
xhs目前的状态就是国内外帖子并存,不知道后续是否会做隔离方案?
用户增长、流量暴增,带动小红书股价上涨的同时,对内部程序员的要求也必然会更高,需要他们在维持生态稳定、性能优化、异常监控等多方面做到更好更严谨,对未来的招聘流程,想必也会把控更严格,优中择优。后续有想法面xhs的小伙伴,要做好心理准备啦。
这里给大家分享三道大数据岗位,小红书之前考过的算法题,要求 30 分钟写完!!!
各位小伙伴们也可以测一下是否能在规定时间内搞定这3题。
算法题
面试官:1 写一个算法吧,求 两数之和
解题思路:
创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。
使用哈希表,可以将寻找 target - x 的时间复杂度降低到从 O(N) 降低到 O(1)。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; ++i) {
if (hashtable.containsKey(target - nums[i])) {
return new int[]{hashtable.get(target - nums[i]), i};
}
hashtable.put(nums[i], i);
}
return new int[0];
}
}
复杂度分析:
时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以O(1) 地寻找 target - x。
空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。
面试官:2 再写个 三数之和
解题思路:
ArrayList 集合 + 排序 + 双指针
- 先创建集合 ArrayList。
- 判断数组长度小于3,返回定义的集合。
- 对数组排序 Arrays.sort(nums);
- for循环遍历数组;
- 判断,当nums[i] >0 返回 break;因为nums[i] 大于0了,后面的都大于0了
- 判断 当nums[i] ==nums[i-1],continue;
- 定义双指针 L = i+1; R = len-1;
- while(R>L) 定义 sum = nums[i] + nums[L] + nums[R];
- 判断 当sum == 0, 将三个数封装成集合,装进 listArray.
- 当 sum > 0,证明R 往后更大,所以 R--;
- 当 sum < 0,证明 R已经是最大了,L应该往右移,L++。
- 返回 listArray
class Solution {
//nums = [-1,0,1,2,-1,-4] ,[[-1,-1,2],[-1,0,1]]
public List<List<Integer>> threeSum(int[] nums) {
// 1 新建 list 集合
List<List<Integer>> listArray = new ArrayList<>();
// 2 条件判断
if(nums ==null || nums.length<3){
return listArray;
}
//3 排序 [-4,-1,-1,0,1,2]
Arrays.sort(nums);
int len = nums.length;
// 4 for 循环遍历
for(int i =0;i<len;i++){
if(nums[i]>0) break;
if(i>0 && nums[i] == nums[i-1]) continue;
// 5 定义双指针
int L = i+1;
int R = len-1;
while(R>L){
int sum = nums[i] + nums[L] + nums[R];
// 6 判断 sum ==0
if(sum ==0){
listArray.add(Arrays.asList(nums[i],nums[L],nums[R]));
while(L<R && nums[L] ==nums[L+1]) L++;
while(L<R && nums[R] == nums[R-1]) R--;
L++;
R--;
}
if(sum >0){
R--;
}
if(sum <0){
L++;
}
}
}
return listArray;
}
}
时间复杂度:O(n^2)
3 面试官:看时间充沛,再来一道,求数组中递增子序列,数组中最多可以除去一个数字
举例:
(1)输入:1,3,6,2,7,5 输出:4
含义:当去除2时,最大递增子序列长度为1,3,6,7,所以长度为 4
(1)输入:1,3,8,2,6,5,7,9,3,11,1,2,3,4,3,5,6,7,8 输出:8
含义:当去除数字 3 时,最大长度为1,2,3,4,5,6,7,8 所以长度为8
解题思路:
该题的做法就是,定义最大递增长度初始值 max = 0,同时定义 累加器初始值 count = 1, 并定义开关初始值 flag = 0, 因为题目要求最多只能去除一个数字,所以让 flag 刚开始为0,当遇到要去除的数字时,flag ++,然后判断 flag <=1 里面的逻辑即可。
代码如下:
public static int test(int[] nums){
if(nums.length==0||nums==null){
return 0;
}
// 累加器初始值为 1
int count = 1;
// 定义最大递增序列初始值为 1
int max = 1;
// 定义开关 flag 初始值为 0
int flag = 0;
for(int i=1;i<nums.length;i++){
if(flag<=1){
if(nums[i] - nums[i-1] >0){
count++;
}else {
if (i==nums.length-1) {
break;
}
if(nums[i+1]-nums[i-1]>0&&nums[i] - nums[i-1]<=0){
flag++;
}else {
count = 1;
}
}
}else{
flag = 0;
count = 1;
}
max = Math.max(count,max);
}
return max;
}
以上就是本次分享的面试内容~
增值服务
增值服务:简历修改|面试辅导|Flink资料|模拟面试
你好,我是土哥,计算机硕士毕业,现某大厂资深大数据开发工程师。出生在一个 18 线开外的小村庄,通过自己努力毕业一年在新一线城市买房,在社招、校招斩获 28 家中大厂 offer。
土哥社招参加 28 场面试,100% 通过率,拿到全部 offer!
土哥这半年的悲惨人生,经历过被鸽 offer,最终触底反弹~
25 年新的一年,很多公司已经开启了节前面试-年后入职的流程。如果你想跳槽,但苦于一个人孤军奋战、无人指导、复习无从下手,或者不擅长写简历,手上只有拿不出手的毫无难点亮点的项目经历...
那么我的建议是多和身边的大佬沟通,哪怕是付费咨询,只要你能从他身上学到经验,那就是值得的。如果身边没有这样的人,那么我就毛遂自荐一下吧,毕竟,茫茫网络你能看到这篇文章何尝不是一种命运安排。
如果这篇文章对您有所帮助,或者有所启发的话求一键三连:点赞、转发、在看。
+土哥: ******************, 一块交流大数据~
#小红书求职进展汇总##tiktok#