一、手撕
1.300最长上升子序列
如果是原始的题目,直接用d就能解决;面经里出现一个变就是循环最长上升子序列就是可以任何位置开始它前面位置。
解决方法是复制一份数组,接在后面,以原始的每个位置为起点,判断长度为n的这段里的最长上升序列,可以使用一个vector维护对应某个长度的最小的数。
2.8字符串转换整数
这道题比较难的地方就是处理可能会大于INT_MAX和小于INT_MIN的情况,需要提前一位判断,因为int存不下,不过也可以有另一个思路我现在想到了,就是利用long。
3.43字符串相乘
字符串相加的话就是逐步的从最后两个字符串去遍历就好了,放在vector里,在组合结果,我们这里就是,n和m位相乘最多n+m位,用这样一个数组去存储,同时,去掉前面的零。
二、面经笔记
a.AI coding相关的
1.harness技术上的层次是怎么样的
harness是马具在层次上分成,编排和控制、工具调用、上下文和记忆管理、状态和持久化、可靠性安全性的保证,比如校验输入,过滤输出,校验输出。
从这些角度去回答,这个我联想到了不同的ai 范式,不同的engineering,比如context engineering就是解决第三个,harness最开始主要是解可靠性,对抗随机性。
2.如何把AI coding融入开发流程
这道题从需求------开发------测试------上线的角度去回答,在需求阶段,明确业务目标,接口要求和性能约束,让ai帮忙拆解,分析可能的技术选型,开发者做决策;在开发阶段,逐步迭代把大的需求拆成多个可以独立验证的任务,然后明确范围去修改,完成一个模块就git diff,关注接口变化,并发安全,编译、测试,git提交,测试是让ai生成测试用例覆盖正常情况,异常情况边界情况,上线要持续监控各类指标,比如业务是否逻辑正常,延迟,压测是否能行。
b.场景题
1.一份文件太大了,存储空间占满了怎么办?
这道题从用户配额,单点的承受能力,分布式系统,以及优化数据本身去考虑,首先如果用户配额不足提醒用户清理或者扩容,单点不足可以去在分布式系统中去存储,通过元数据记录分片在哪个节点,分布式系统如果也不足够可以扩容,对于数据也可以通过压缩,去重去存储。
2.秒杀系统如何解决超卖问题?
首先如果是数据库系统可以通过事务中,把update和判断库存在一个语句去完成,在有redis的情况,也就是有缓存的情况,可以redis中通lua脚本原子的判断和扣减,在真实场景需要确保缓存和数据库一致,提前持有。
3.消息队列消息堆积怎么处理?消息重复怎么处理?
对于堆积,首先看监控,判断生产速率和消费速率如果是突然生产者上升,可能要通过限流、熔断降级,如果消费变慢,要查慢查询,磁盘瓶颈,cpu瓶颈,如果是cpu问题可能要优化业务逻辑,可能要减少锁的竞争,如果是cpu没有被充分利用,可能是需要增加线程池线程,最终要观测。
消息重复要在生产者阶段通过确认机制,然后broker要保证幂等性,确保不接收同样的数据在消费阶段要根据id保证不要重复消费。
c.常见八股
1.http和https的区别
https在http的基础上,通过建立tls连接提供了身份认证,数据完整性校验和加密,先是客户端发送clienthello、服务端返回serverhello,之后发送对应的证书,客户端校验,然后双方根据非对称性加密生成对称加密的密钥,然后通信。
2.操作系统如何创建线程?
pthread_create去创建,然后首先是分配线程资源,栈空间、初始化线程上下文,包括程序计数器,栈指针,然后使得线程能访问共享进程资源,加入调度系统。