首页 > 数据库 > 数据库开发技术 > 大数据面试,被问到频率最高的三道考题,值得一看~
点击上方公众号进入 3分钟秒懂大数据 主页
然后点击右上角 “设为标星”
比别人更快接收硬核文章
大家好,我是土哥。
辅导的多位学生已经入职各大公司,这里给大家反馈 3 道他们在面试大数据岗位时,被问到最多的高频 Leetcode 考题,俗称夺命题。
土哥也混迹大厂多年,深知面试官一般的面试心理,对于那些简历看着还不错,但是面试面的不太好,但又不想直接刷掉的求职人员,就会用这些题来虐虐各位,做不出来,那就直接跪了,能做出来,就安排下一轮面试。话不多说,直接上题目~
LRU 算法,真的是被问频率最高的题目之一,尤其是字节、小红书这两家公司。
LRU 被称作最近最少使用算法,是一种页面置换算法。其核心思想是将最近最久未使用的页面予以淘汰。就是一种缓存淘汰算法。
实现思路:
LRU 缓存机制可以通过哈希表 + 双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。
双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久未使用的。
哈希表即为普通的哈希映射(HashMap),通过缓存数据的键映射到其在双向链表中的位置。
这样以来,我们首先使用哈希表进行定位,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1) 的时间内完成 get 或者 put 操作。
算法实现如下:
public class LRUCache {
class DLinkedNode {
int key;
int value;
DLinkedNode prev;
DLinkedNode next;
public DLinkedNode() {}
public DLinkedNode(int _key, int _value) {key = _key; value = _value;}
}
private Map<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();
private int size;
private int capacity;
private DLinkedNode head, tail;
public LRUCache(int capacity) {
this.size = 0;
this.capacity = capacity;
// 使用伪头部和伪尾部节点
head = new DLinkedNode();
tail = new DLinkedNode();
head.next = tail;
tail.prev = head;
}
public int get(int key) {
DLinkedNode node = cache.get(key);
if (node == null) {
return -1;
}
// 如果 key 存在,先通过哈希表定位,再移到头部
moveToHead(node);
return node.value;
}
public void put(int key, int value) {
DLinkedNode node = cache.get(key);
if (node == null) {
// 如果 key 不存在,创建一个新的节点
DLinkedNode newNode = new DLinkedNode(key, value);
// 添加进哈希表
cache.put(key, newNode);
// 添加至双向链表的头部
addToHead(newNode);
++size;
if (size > capacity) {
// 如果超出容量,删除双向链表的尾部节点
DLinkedNode tail = removeTail();
// 删除哈希表中对应的项
cache.remove(tail.key);
--size;
}
}
else {
// 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部
node.value = value;
moveToHead(node);
}
}
private void addToHead(DLinkedNode node) {
node.prev = head;
node.next = head.next;
head.next.prev = node;
head.next = node;
}
private void removeNode(DLinkedNode node) {
node.prev.next = node.next;
node.next.prev = node.prev;
}
private void moveToHead(DLinkedNode node) {
removeNode(node);
addToHead(node);
}
private DLinkedNode removeTail() {
DLinkedNode res = tail.prev;
removeNode(res);
return res;
}
}
时间复杂度 O(1)
空间复杂度 O(capacity)
因为大数据场景,经常会处理字符串,所以考察字符串的处理频率非常高,这里最长连续序列这个,就比较常考
要求: 时间复杂度为O(n)
0 <= nums.length <= 105 -109 <= nums[i] <= 109
解题思路: 使用 hashSet + Math.max(longestMax,curMax) 求解。
根据题目要求,只要数组中包含连续数字,就统计连续数字个数,不包含重复值,所以:
我们可以使用 HashSet 来存储数组的值,这样直接过滤掉重复值啦。
其次,先定义 最大 连续数组初始值为 0,遍历集合,通过判断集合中是否有比当前值小 1 的数字,如果没有,定义 当前最大长度 curMax =1,并且 让当前数字 curNum = num.
然后判断当前数字是否有比他大 1 的数,有的话,当前最大长度 curMax ++,curNum++;
最后求 Math.max(longestMax,curMax);
代码如下:
public static int longestConsecutive(int[] nums) {
Set<Integer> set_num = new HashSet<>();
for (int num:nums) set_num.add(num);
//定义最长序列个数初始值为0
int longestMax = 0;
for(int num: set_num){
if(!set_num.contains(num-1)){
int curNum = num;
int curMax = 1;
while(set_num.contains(curNum+1)){
curNum++;
curMax++;
}
longestMax = Math.max(longestMax,curMax);
}
}
return longestMax;
}
时间复杂度 O(n)
空间复杂度 O(n)
三数之和这道题,一般会和两数之和挂钩,面试官会先让你口述入门两数之和,你回答出来了,那就直接上手三数之和,考考你的应变能力。
三数之和如下:
解题思路:
ArrayList 集合 + 排序 + 双指针
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)
以上就是经常考的三道高频考题,希望能对各位小伙伴有所帮助~
简历修改+面试辅导|大数据资料|ChatGpt|模拟面试|谈薪技巧
你好,我是土哥,计算机硕士毕业,现某大厂资深大数据开发工程师。出生在一个 18 线开外的小村庄,通过自己努力毕业一年在新一线城市买房,在社招、校招斩获 25 家中大厂 offer。
10月已经中旬,同学们一定要重视,社招的同学也要把握好跳槽时机。如果你是一个人孤军奋战,苦于无人指导、复习无从下手,或者不擅长写简历,手上只有拿不出手的毫无难点亮点的项目经历...
那么我的第一建议是多和身边的大佬沟通,哪怕是付费咨询,只要你能从他身上学到经验,那就是值得的。如果身边没有这样的人,那么我就毛遂自荐一下哈,要知道,茫茫网络你能看到这篇文章就是一种缘分。
土哥社招参加 28 场面试,100% 通过率,拿到全部 offer!
土哥这半年的悲惨人生,经历过被鸽 offer,最终触底反弹~

原文作者:3分钟秒懂大数据;如有侵权,请联系管理员删除。