ITPub博客

首页 > 数据库 > 数据库开发技术 > 大数据面试,被问到频率最高的三道考题,值得一看~

大数据面试,被问到频率最高的三道考题,值得一看~

原创 数据库开发技术 作者:3分钟秒懂大数据 时间:2024-10-14 08:00:00 0 删除 编辑

点击上方公众号进入 3分钟秒懂大数据 主页

然后点击右上角 “设为标星” 

比别人更快接收硬核文章

大家好,我是土哥。

辅导的多位学生已经入职各大公司,这里给大家反馈 3 道他们在面试大数据岗位时,被问到最多的高频 Leetcode 考题,俗称夺命题。

土哥也混迹大厂多年,深知面试官一般的面试心理,对于那些简历看着还不错,但是面试面的不太好,但又不想直接刷掉的求职人员,就会用这些题来虐虐各位,做不出来,那就直接跪了,能做出来,就安排下一轮面试。话不多说,直接上题目~

LRU

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) 求解。

根据题目要求,只要数组中包含连续数字,就统计连续数字个数,不包含重复值,所以:

  1. 我们可以使用 HashSet 来存储数组的值,这样直接过滤掉重复值啦。

  2. 其次,先定义 最大 连续数组初始值为 0,遍历集合,通过判断集合中是否有比当前值小 1 的数字,如果没有,定义 当前最大长度 curMax =1,并且 让当前数字 curNum = num.

  3. 然后判断当前数字是否有比他大 1 的数,有的话,当前最大长度 curMax ++,curNum++;

  4. 最后求 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 集合 + 排序 + 双指针

  1. 先创建集合 ArrayList。
  2. 判断数组长度小于3,返回定义的集合。
  3. 对数组排序 Arrays.sort(nums);
  4. for循环遍历数组;
  5. 判断,当nums[i] >0 返回 break;因为nums[i] 大于0了,后面的都大于0了
  6. 判断 当nums[i] ==nums[i-1],continue;
  7. 定义双指针 L = i+1; R = len-1;
  8. while(R>L) 定义 sum = nums[i] + nums[L] + nums[R];
  9. 判断 当sum == 0, 将三个数封装成集合,装进 listArray.
  10. 当 sum > 0,证明R 往后更大,所以 R--;
  11. 当 sum < 0,证明 R已经是最大了,L应该往右移,L++。
  12. 返回 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)

以上就是经常考的三道高频考题,希望能对各位小伙伴有所帮助~

面试辅导

简历修改+面试辅导|大数据资料|ChatGpt|模拟面试|谈薪技巧


你好,我是土哥,计算机硕士毕业,现某大厂资深大数据开发工程师。出生在一个 18 线开外的小村庄,通过自己努力毕业一年在新一线城市买房,在社招、校招斩获 25 家中大厂 offer。

10月已经中旬,同学们一定要重视,社招的同学也要把握好跳槽时机。如果你是一个人孤军奋战,苦于无人指导、复习无从下手,或者不擅长写简历,手上只有拿不出手的毫无难点亮点的项目经历...

那么我的第一建议是多和身边的大佬沟通,哪怕是付费咨询,只要你能从他身上学到经验,那就是值得的。如果身边没有这样的人,那么我就毛遂自荐一下哈,要知道,茫茫网络你能看到这篇文章就是一种缘分。

    土哥社招参加 28 场面试,100% 通过率,拿到全部 offer!

    土哥这半年的悲惨人生,经历过被鸽 offer,最终触底反弹~

    需要任一增值服务或进大厂交流求职群
    都欢迎加土哥微信(备注来意)

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

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2021-06-15

  • 博文量
    98
  • 访问量
    42098