美团暑实面经 已offer
一面:
1. SpingBoot的自动装配
2. 多线程了解吗,说一下线程池的核心参数和工作原理
3. 项目相关,大概5-6个问题
4. sql题:student表和score表,找平均分大于85的学生
5. 栈和队列的区别
6. 手撕:用两个栈实现一个队列(说我代码习惯挺好的)
7. B+树了解吗
8. 最左匹配原则是什么
9. Redis分布式锁怎么实现
10. watchdog机制了解吗,用过还是看过
11. 手撕:链表版两数相加 lc2
二面:
1. 分享一个项目中解决问题的思路过程
2. 若干项目问题
3. sql题:scores(id,student_id,course_id, score)查询每门课成绩都在60分以上的同学
4. 根据最左匹配原则判断索引 index i(a,b),8条(其中有一条模糊匹配判断错了)
5. 为什么模糊匹配不走索引?(原理,B+树特点)
6. 为什么要遵循最左匹配原则?
7. 两个sql语句,一个查询条件(ab),一个查询条件(abc),说说区别,在Mysql的执行过程中
8. 给了一个调用sum(a,b) { return a+b; }的代码,从计算机/底层的角度,CPU的角度描述一下如何完成这个函数调用过程
9. 智力题:64枚硬币,每次可以取1,2,3,4枚,不可以不取,取到最后一枚的赢,你怎么保证你会赢(✅)
1. 如果取到最后一枚的输呢,怎么修改策略(✅)
2. 如果不允许双方取3枚,怎么修改策略(引导后✅)
10. volatile字段的作用
11. 说一下ClassLoader怎么加载Java程序的,机制(说到双亲委派被打断)
12. 手撕:重排链表 LeetCode143,限制了时间/空间复杂度 O(n)/O(1)
timeline:
投递:3.30
笔试:4.5
一面:4.21
二面:4.23
oc:4.27
offer:4.29
#我的OC时间线#
1. SpingBoot的自动装配
2. 多线程了解吗,说一下线程池的核心参数和工作原理
3. 项目相关,大概5-6个问题
4. sql题:student表和score表,找平均分大于85的学生
5. 栈和队列的区别
6. 手撕:用两个栈实现一个队列(说我代码习惯挺好的)
7. B+树了解吗
8. 最左匹配原则是什么
9. Redis分布式锁怎么实现
10. watchdog机制了解吗,用过还是看过
11. 手撕:链表版两数相加 lc2
二面:
1. 分享一个项目中解决问题的思路过程
2. 若干项目问题
3. sql题:scores(id,student_id,course_id, score)查询每门课成绩都在60分以上的同学
4. 根据最左匹配原则判断索引 index i(a,b),8条(其中有一条模糊匹配判断错了)
5. 为什么模糊匹配不走索引?(原理,B+树特点)
6. 为什么要遵循最左匹配原则?
7. 两个sql语句,一个查询条件(ab),一个查询条件(abc),说说区别,在Mysql的执行过程中
8. 给了一个调用sum(a,b) { return a+b; }的代码,从计算机/底层的角度,CPU的角度描述一下如何完成这个函数调用过程
9. 智力题:64枚硬币,每次可以取1,2,3,4枚,不可以不取,取到最后一枚的赢,你怎么保证你会赢(✅)
1. 如果取到最后一枚的输呢,怎么修改策略(✅)
2. 如果不允许双方取3枚,怎么修改策略(引导后✅)
10. volatile字段的作用
11. 说一下ClassLoader怎么加载Java程序的,机制(说到双亲委派被打断)
12. 手撕:重排链表 LeetCode143,限制了时间/空间复杂度 O(n)/O(1)
timeline:
投递:3.30
笔试:4.5
一面:4.21
二面:4.23
oc:4.27
offer:4.29
#我的OC时间线#
全部评论
mark
cpu角度 有点过于刁难,过不了我直接你手撕一个汇编代码出来我看看
class Solution:
def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
pre, cur = None, head
while cur:
nxt = cur.next
cur.next = pre
pre = cur
cur = nxt
return pre
def reorderList(self, head: Optional[ListNode]) -> None:
mid = self.middleNode(head)
head2 = self.reverseList(mid)
while head2.next:
nxt = head.next
nxt2 = head2.next
head.next = head2
head2.next = nxt
head = nxt
head2 = nxt2
这是经典的博弈论取硬币问题,核心策略就是控制“5的倍数”这个关键点哦~具体操作很简单:
1. 先手第一步:先取4枚硬币,让剩余硬币数变成60(60是5的倍数)。
2. 后续每轮:对手取x枚(1≤x≤4),你就取“5-x”枚。这样每轮结束后,剩余硬币数始终保持是5的倍数。
3. 最后阶段:当剩余5枚硬币时,对手不管取1-4枚中的多少,你都能取走剩下的所有硬币,赢!
比如对手取2枚,你就取3枚;对手取4枚,你就取1枚,始终把总数控制在5的倍数上~这样一步步就能把最后一枚硬币稳稳拿到手啦~
因为联合索引是按最左列排序的,跳过最左列会导致索引失效,数据库只能全表扫描
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:
dummy = ListNode()
curr = dummy
carry = 0
while l1 or l2 or carry:
sum_val = carry
if l1:
sum_val += l1.val
l1 = l1.next
if l2:
sum_val += l2.val
l2 = l2.next
carry, val = divmod(sum_val, 10)
curr.next = ListNode(val)
curr = curr.next
return dummy.next
class MyQueue:
def __init__(self):
self.stack_in = []
self.stack_out = []
def push(self, x):
self.stack_in.append(x)
def pop(self):
if not self.stack_out:
while self.stack_in:
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
def peek(self):
if not self.stack_out:
while self.stack_in:
self.stack_out.append(self.stack_in.pop())
return self.stack_out[-1]
def empty(self):
return not self.stack_in and not self.stack_out
mark
mark
mark
mark
mark
mark
mark
mark
m
接好运
接好运
mark
mark
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享