首页 > 数据库 > 数据库开发技术 > 小米有点意思,选择不躺平,冲!
免费学习网站:https://itgogogo.cn
大家好,我是皇子。
相信很多人都还记得雷军大佬 3 年前,开启的 100 亿豪赌,“这将是我人生中最后一次重大的创业项目”。
他为造车下足了血本,甚至“愿意押上人生全部的声誉”。
好消息是,随着小米集团宣布,首款智能汽车将在 3 月底正式上市,股价也是连续两日上涨,这场新能源汽车的战役算是正式拉开帷幕。
不得不说,造型挺好看的,重要的是C级高性能轿车,期待价钱也能感动人心。
因为相信小米公司的基本盘是稳固的,具备良好潜力的。有同学已经不想再躺平了,决定好好准备下,冲小米。
下面分享一位小米后端的面经,总共两轮技术面,面试内容除了后端的八股文,还有项目经验的介绍,我把相关的内容,帮大家做些整理。
考察的知识点:
想起面试的最大痛苦,莫过于每次都要重温算法了,但是既然选择不躺平,就得往前冲!放心,我只会挑些经典的,从简单到困难去进阶,重要的是算法思维。
❝单链表解法💡tips:双指针
❝leetcode 原题:https://leetcode.cn/problems/merge-two-sorted-lists/description/
难度系数:简单
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
看完题目思考 60 秒...
不知道大家有没有思路,下面我们一步步看代码,看注释,去理解。
❝代码是经过验证的,并且提供测试用例
package listnode
func MergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
// 创建一个虚拟头节点,便于处理边界情况
dummy := &ListNode{Val: 0, Next: nil} // 虚拟头节点
tail := dummy // 尾部指针,初始指向虚拟头节点
// 使用循环遍历两个链表直到至少有一个链表遍历完
for l1 != nil && l2 != nil {
// 比较当前节点的值,将值较小的节点链接到结果链表上
if l1.Val < l2.Val {
tail.Next = l1 // 连接l1节点
l1 = l1.Next // 移动l1指针到下一个节点
} else {
tail.Next = l2 // 连接l2节点
l2 = l2.Next // 移动l2指针到下一个节点
}
tail = tail.Next // 更新结果链表的尾部指针
}
// 当一个链表遍历完后,将另一个未遍历完的链表剩余部分接到结果链表后面
if l1 != nil {
tail.Next = l1 // 若l1还未遍历完,将其余部分接到结果链表
} else {
tail.Next = l2 // 若l2还未遍历完,将其余部分接到结果链表
}
// 返回新链表的实际头部(即虚拟头节点的下一个节点)
return dummy.Next
}
测试用例:有点长,本着可以方便大家直接拿去验证,还是附上去了。不需要的跳过,看下题。
package listnode
import (
"reflect"
"testing"
)
// 合并两个有序链表
func TestMergeTwoLists(t *testing.T) {
type args struct {
list1 *ListNode
list2 *ListNode
}
tests := []struct {
name string
args args
want *ListNode
}{
{
name: "",
args: args{
list1: &ListNode{
Val: 1,
Next: &ListNode{
Val: 2,
Next: nil,
},
},
list2: nil,
},
want: &ListNode{
Val: 1,
Next: &ListNode{
Val: 2,
Next: nil,
},
},
},
{
name: "",
args: args{
list1: &ListNode{
Val: 1,
Next: nil,
},
list2: &ListNode{
Val: 1,
Next: &ListNode{
Val: 2,
Next: nil,
},
},
},
want: &ListNode{
Val: 1,
Next: &ListNode{
Val: 1,
Next: &ListNode{
Val: 2,
Next: nil,
},
},
},
},
{
name: "",
args: args{
list1: &ListNode{
Val: 1,
Next: &ListNode{
Val: 3,
Next: &ListNode{
Val: 5,
Next: &ListNode{
Val: 7,
Next: nil,
},
},
},
},
list2: &ListNode{
Val: 2,
Next: &ListNode{
Val: 4,
Next: &ListNode{
Val: 6,
Next: &ListNode{
Val: 8,
Next: nil,
},
},
},
},
},
want: &ListNode{
Val: 1,
Next: &ListNode{
Val: 2,
Next: &ListNode{
Val: 3,
Next: &ListNode{
Val: 4,
Next: &ListNode{
Val: 5,
Next: &ListNode{
Val: 6,
Next: &ListNode{
Val: 7,
Next: &ListNode{
Val: 8,
Next: nil,
},
},
},
},
},
},
},
},
},
}
for _, tt := range tests {
// reflect.DeepEqual 和 遍历链表都可以判断结果与期望值是否一致
// 判断结果与期望值是否一致方法一
t.Run(tt.name, func(t *testing.T) {
if got := MergeTwoLists(tt.args.list1, tt.args.list2); !reflect.DeepEqual(got, tt.want) {
t.Errorf(">1: MergeTwoListsV1() = %v, want %v", got, tt.want)
}
})
}
}
要理解分布式的优缺点,我们先看个例子:
有一个电商网站,在采用分布式架构后,商品展示、订单处理、支付服务、库存管理等都可以作为独立的服务运行在不同的服务器上。
这样,当某一服务面临高峰期压力时,只需单独扩容该服务即可;同时,如果某个服务器发生故障,只会影响对应服务,其他服务依然能够正常运行,保证了网站整体的可用性。
但同时,这也意味着在设计时必须考虑到商品库存状态在多个服务之间如何实时同步、订单状态在不同阶段如何跨服务一致等问题。
下面用更加从专业性的角度解析分布式的优缺点。
1、 可扩展性(Scalability):
垂直扩展(Scale Up):当单一节点性能不足以满足需求时,分布式架构允许我们通过添加更多机器来水平扩展(Scale Out),而不是升级单个机器的硬件配置,从而使得系统能够处理更大的流量和数据量。
伸缩灵活性:可以根据业务需求的变化动态增减服务器资源,避免过度投资或因资源不足导致服务质量下降。
2、 高可用性(High Availability):
3、 业务解耦(Decoupling):
4、 并发处理能力强:
5、 运维便利:
然而,分布式架构不是银弹,也存在一些显著的缺点:
1、 架构复杂性:
2、 通信成本:
3、 运维管理:
4、 开发和团队协作:
| 维度 | 分布式架构 | 集群架构 |
|---|---|---|
| 定义 | 将系统拆分成多个独立且协同工作的服务或组件,分别部署在不同的物理或虚拟节点上,通过网络通信协作 | 多台服务器或节点共同提供服务,它们运行相同或相似的应用程序,形成一个整体以实现高可用、负载均衡或性能提升 |
| 架构特性 | 模块化、松耦合、服务多样 | 同质化、高冗余、聚焦同一任务 |
| 扩展方式 | 水平扩展,增加服务节点 | 水平扩展,增加相同应用实例 |
| 容错性 | 单个服务失败不影响整体服务,可通过服务冗余和故障转移保障高可用 | 单点故障可能影响集群,但可通过冗余节点和负载均衡器实现故障转移 |
| 数据处理 | 数据分散在不同节点,需处理分布式数据一致性问题 | 数据可能共享或冗余,一致性问题相对简单 |
| 负载均衡 | 自然具备负载均衡属性,可根据服务负载动态分配请求 | 依赖负载均衡器进行请求分配,节点间负载相对均匀 |
| 系统复杂度 | 设计、实现和运维相对复杂,涉及分布式协调、事务处理等难题 | 实现相对简单,但高可用和负载均衡机制的设置和维护有一定复杂度 |
| 通信 | 节点间通信频繁,可能涉及复杂的消息传递和数据同步 | 节点间通信相对简单,主要关注节点内数据同步和状态保持 |
| 开发与部署 | 鼓励微服务化,独立开发、部署和升级,有利于敏捷开发 | 通常一次性部署,更新可能需要批量操作 |
基于数据库实现
实现步骤:
SELECT ... FOR UPDATE(悲观锁)阻止其他事务读取直到事务结束,或利用乐观锁(如版本号机制)检查在更新之前数据是否已被改变。基于Redis实现
实现步骤:
SETNX(设置并判断是否存在)来获取锁,配合EXPIRE设置锁的有效时间,防止死锁。DEL命令删除键。基于消息队列实现
实现步骤:
推荐阅读
原文作者:皇子谈技术;如有侵权,请联系管理员删除。