- 0
- 0
- 约7.54千字
- 约 22页
- 2026-02-06 发布于福建
- 举报
第PAGE页共NUMPAGES页
2026年软件开发工程师面试技巧与考题集
一、编程语言基础(5题,每题10分,共50分)
(针对Java/Python/JavaScript,侧重中国互联网企业常用场景)
1.题目:
用Java实现一个简单的LRU(LeastRecentlyUsed)缓存,要求时间复杂度为O(1)。
答案:
java
importjava.util.HashMap;
publicclassLRUCacheK,V{
privatefinalintcapacity;
privatefinalHashMapK,Nodemap;
privateNodehead,tail;
staticclassNode{
Kkey;
Vvalue;
Nodeprev,next;
Node(Kkey,Vvalue){
this.key=key;
this.value=value;
}
}
publicLRUCache(intcapacity){
this.capacity=capacity;
map=newHashMap();
}
publicVget(Kkey){
Nodenode=map.get(key);
if(node==null)returnnull;
moveToHead(node);
returnnode.value;
}
publicvoidput(Kkey,Vvalue){
Nodenode=map.get(key);
if(node!=null){
node.value=value;
moveToHead(node);
}else{
NodenewNode=newNode(key,value);
map.put(key,newNode);
addToHead(newNode);
if(map.size()capacity){
Nodetail=removeTail();
map.remove(tail.key);
}
}
}
privatevoidmoveToHead(Nodenode){
removeNode(node);
addToHead(node);
}
privatevoidaddToHead(Nodenode){
node.prev=head;
node.next=head.next;
if(head.next!=null)head.next.prev=node;
head.next=node;
if(tail==null)tail=node;
}
privatevoidremoveNode(Nodenode){
if(node.prev!=null)node.prev.next=node.next;
if(node.next!=null)node.next.prev=node.prev;
if(node==head)head=node.next;
if(node==tail)tail=node.prev;
}
privateNoderemoveTail(){
Noderes=tail;
removeNode(tail);
returnres;
}
}
解析:
LRU缓存的核心是双向链表+哈希表。双向链表维护最近使用顺序,哈希表实现O(1)查找。当缓存满时,移除链表尾部节点(最久未使用)。
2.题目:
用Python实现一个线程安全的计数器,要求支持多线程并发操作。
答案:
python
importthreading
classThreadSafeCounter:
def__init__(self):
self.value=0
self.lock=threading.Lock()
defincrement(self):
withself.lock:
self.value+=1
returnself.value
defdecrement(self):
withself.lock:
self.value-=1
returnself.value
解析:
使用`threading.Lock`确保线程互斥,避免并发修改导致数据错乱。
3.题目:
用JavaScript实现一个函数,判断一个字符串是否是有效的括号组合(如()、()[]{})。
答案:
javascript
functionisValid(s){
conststack=[];
constmap={
原创力文档

文档评论(0)