最后

我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

文章目录

题目: 示例: 思路: C++代码 Java代码

题目:

运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。

实现 LRUCache 类:

LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存

int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。

void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。

进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?

示例:

输入

[“LRUCache”, “put”, “put”, “get”, “put”, “get”, “put”, “get”, “get”, “get”]

[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]

输出

[null, null, null, 1, null, -1, null, -1, 3, 4]

解释

LRUCache lRUCache = new LRUCache(2);

lRUCache.put(1, 1); // 缓存是 {1=1}

lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}

lRUCache.get(1); // 返回 1

lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}

lRUCache.get(2); // 返回 -1 (未找到)

lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}

lRUCache.get(1); // 返回 -1 (未找到)

lRUCache.get(3); // 返回 3

lRUCache.get(4); // 返回 4

提示:

1 <= capacity <= 3000

0 <= key <= 10000

0 <= value <= 105

最多调用 2 * 105 次 get 和put

思路:

定义双向链表 DLinkedNode*

定义哈希表

添加方法

//将节点移到头部

//删除该节点

//删除尾结点并返回该节点

int get(int key) {

if(key不存在){

return -1;

}

key 存在

先通过哈希表定位

再移到头部

返回该值

}

void put(int key, int value) {

if(key不存在) {

创建一个新的节点

将节点添加到头部

更新哈希表

长度加一

if(添加后长度越界){

删除尾结点并返回该节点

在哈希表中清除该节点

长度减一

}

}else{

key 存在

先通过哈希表定位

再修改 value

移到头部

}

复杂度分析

时间复杂度:对于 put 和 get 都是 O(1)。 空间复杂度:O(capacity),因为哈希表和双向链表最多存储 capacity+1 个元素。

C++代码

struct DLinkedNode{

int key, value;

DLinkedNode* prev;

DLinkedNode* next;

DLinkedNode(): key(0),value(0),prev(nullptr),next(nullptr) {}

DLinkedNode(int key, int value): key(key),value(value),prev(nullptr),next(nullptr) {}

};

class LRUCache {

private:

unordered_map cache;

DLinkedNode* head; //伪首部

DLinkedNode* tail; //伪尾部

int size;

int capacity;

public:

LRUCache(int capacity) {

head = new DLinkedNode();

tail = new DLinkedNode();

head->next = tail;

tail->prev = head;

this->capacity = capacity;

size = 0;

}

int get(int key) {

if(!cache.count(key)){

return -1;

}

// 如果 key 存在,先通过哈希表定位,再移到头部

DLinkedNode* node = cache[key];

removedNode(node);

addToHead(node);

return node->value;

}

void put(int key, int value) {

if(!cache.count(key)) {

// 如果 key 不存在,创建一个新的节点

DLinkedNode* node = new DLinkedNode(key, value);

addToHead(node);

cache[key] = node;

size++;

if(size > capacity) {

DLinkedNode* removed = removedTail();

cache.erase(removed->key);

size–;

}

}else{

// 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部

DLinkedNode* node = cache[key];

node->value = value;

removedNode(node);

addToHead(node);

}

}

//删除该节点

void removedNode(DLinkedNode* node) {

node->prev->next = node->next;

node->next->prev = node->prev;

最后的内容

在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)

如何准备面试?

1、前期铺垫(技术沉积)

程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。

下面是我会看的一些资料笔记,希望能帮助大家由浅入深,由点到面的学习Java,应对大厂面试官的灵魂追问

这部分内容过多,小编只贴出部分内容展示给大家了,见谅见谅!

Java程序员必看《Java开发核心笔记(华山版)》

Redis学习笔记

Java并发编程学习笔记

四部分,详细拆分并发编程——并发编程+模式篇+应用篇+原理篇

Java程序员必看书籍《深入理解 ava虚拟机第3版》(pdf版)

大厂面试必问——数据结构与算法汇集笔记

其他像Spring,SpringBoot,SpringCloud,SpringCloudAlibaba,Dubbo,Zookeeper,Kafka,RocketMQ,RabbitMQ,Netty,MySQL,Docker,K8s等等我都整理好,这里就不一一展示了。

2、狂刷面试题

技术主要是体现在平时的积累实用,面试前准备两个月的时间再好好复习一遍,紧接着就可以刷面试题了,下面这些面试题都是小编精心整理的,贴给大家看看。

①大厂高频45道笔试题(智商题)

②BAT大厂面试总结(部分内容截图)

③面试总结

3、结合实际,修改简历

程序员的简历一定要多下一些功夫,尤其是对一些字眼要再三斟酌,如“精通、熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:

以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: