2025年软件开发工程师校招面试题及答案_第1页
2025年软件开发工程师校招面试题及答案_第2页
2025年软件开发工程师校招面试题及答案_第3页
2025年软件开发工程师校招面试题及答案_第4页
2025年软件开发工程师校招面试题及答案_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2025年软件开发工程师校招面试题及答案一、单项选择题(每题2分,共20分)1.在Linux系统中,若进程A通过fork()创建子进程B,随后B调用execve()加载新程序,下列关于文件描述符继承的描述正确的是A.所有打开的文件描述符都会被新程序自动关闭B.只有标记为close-on-exec的文件描述符会被关闭C.只有标准输入、输出、错误会被保留D.文件描述符的继承行为由内核随机决定答案:B。execve()不会自动关闭任何文件描述符,除非在打开时设置了FD_CLOEXEC标志。2.某算法在n=1000时耗时1ms,n=4000时耗时8ms,其时间复杂度最可能是A.O(n)B.O(nlogn)C.O(n²)D.O(n³)答案:C。数据规模扩大4倍,耗时扩大8倍,符合平方关系。3.在C++20中,下列代码片段的输出是```cppinclude<iostream>include<coroutine>structTask{structpromise_type{Taskget_return_object(){return{};}std::suspend_neverinitial_suspend()noexcept{return{};}std::suspend_neverfinal_suspend()noexcept{return{};}voidreturn_void(){}voidunhandled_exception(){}};};Taskfoo(){co_return;}intmain(){foo();std::cout<<"X";}```A.编译失败B.运行无输出C.输出XD.未定义行为答案:C。协程句柄被立即销毁,final_suspend不挂起,主线程继续执行,打印X。4.关于TCP拥塞控制,下列说法错误的是A.慢启动阶段拥塞窗口指数增长B.拥塞避免阶段拥塞窗口线性增长C.发生快速重传后立即将拥塞窗口置为1D.快速恢复阶段拥塞窗口呈算术增长答案:C。快速重传后进入快速恢复,窗口被设为ssthresh+3×MSS,而非直接置1。5.在React18中,下列代码点击按钮后,页面最终显示的数字是```jsxfunctionApp(){const[n,setN]=useState(0);return<buttononClick={()=>{setN(n+1);setN(n+1);}}>{n}</button>;}```A.0B.1C.2D.不确定答案:B。两次setN传入同一快照值,React自动批处理,只+1。6.某MySQL表使用InnoDB,主键为自增整数,事务A插入一条记录后回滚,事务B立即插入,则B获得的主键值A.与A相同B.比A小1C.比A大1D.随机值答案:C。自增计数器不受回滚影响,继续递增。7.在Go1.22中,下列代码是否可能输出“datarace”```govaraintgofunc(){a++}()gofunc(){a++}()```A.一定输出B.可能输出C.不会输出D.编译错误答案:B。未同步的并发写触发datarace,但需运行racedetector才打印。8.在Kubernetes中,某Deployment的replicas=3,Pod模板中配置了podAntiAffinity强制“不同节点”,集群有3节点,此时手动删除一个Pod,ReplicaSet会A.立即新建一个Pod,可能调度到任意节点B.立即新建一个Pod,必须调度到被删Pod所在节点C.等待节点扩容后才新建D.不再新建,因为反亲和无法满足答案:A。调度器会尝试满足反亲和,若节点资源充足即可成功。9.在Java21中,下列代码输出```javavars="a".repeat(1_000_000).intern();System.out.println(s.substring(0,1)=="a");```A.trueB.falseC.抛出异常D.编译错误答案:A。intern后字符串常量池复用,substring(0,1)同样指向池中”a”。10.在Git仓库中,执行`gitreset--hardHEAD~3`后,再执行`gitreflog`,能看到被丢弃的提交A.不能,数据已永久丢失B.能,reflog保留30天C.能,reflog保留90天D.能,reflog永久保留答案:B。reflog默认保留30天,可恢复。二、不定项选择题(每题3分,共15分)11.下列哪些操作可能导致Redis主从复制全量重同步A.主库重启B.从库重启C.主库执行flushallD.复制积压缓冲区溢出答案:A、C、D。从库重启若runid变化或offset找不到也会触发,但单纯重启不一定。12.关于C++模板实例化,下列说法正确的是A.只有被ODR使用的模板才会实例化B.显式实例化声明会抑制隐式实例化C.模板参数推导失败时编译器会尝试用户定义转换D.可变参数模板展开时可用sizeof...(Args)获取个数答案:A、B、D。C错误,模板推导不考虑用户定义转换。13.在Linuxx86-64环境下,下列哪些系统调用会返回两次A.forkB.vforkC.cloneD.execve答案:A、C。fork与clone在父进程和子进程各返回一次。14.下列哪些HTTP头部字段可以用于浏览器缓存控制A.ETagB.Last-ModifiedC.ExpiresD.X-Frame-Options答案:A、B、C。X-Frame-Options用于点击劫持防护。15.在TypeScript5.3中,下列类型属于“模板字面量类型”的是A.`typeT=`hello${string}`B.`typeU='a'|'b'`C.`typeV=`error_${number}`D.`typeW=keyofany`答案:A、C。模板字面量类型需使用模板字符串语法。三、填空题(每空2分,共20分)16.在64位Linux上,一个C程序声明`chara[0];`作为结构体最后一个成员,该成员不占用空间,但可通过`malloc(sizeof(structS)+extra)`动态扩展,这种技巧称为____数组。答案:柔性。17.在Python3.12中,表达式`(lambdaf:lambdan:f(f,n))(lambdaself,x:1ifx<=1elsexself(self,x-1))(5)`的值为____。17.在Python3.12中,表达式`(lambdaf:lambdan:f(f,n))(lambdaself,x:1ifx<=1elsexself(self,x-1))(5)`的值为____。答案:120。递归匿名函数计算阶乘。18.在CSS中,将元素自身宽度设为父元素宽度的50%,同时保持宽高比16:9,应使用单位____与属性____。答案:vw;aspect-ratio:16/9。19.在PostgreSQL16中,查询`SELECTjsonb_array_elements('[1,2,3]')->>0;`的返回类型是____。答案:text。`->>`返回文本。20.在Rust1.75中,实现`Copy`trait必须同时实现____trait。答案:Clone。21.在Zookeeper中,临时节点在客户端____时被自动删除。答案:会话超时或断开。22.在LLVMIR中,标记为`musttail`的尾调用指令要求调用约定与被调用函数____。答案:完全一致。23.在Dockerfile中,指令`COPY--chown=1001:1001app/app`在BuildKit模式下,实际通过____特性实现用户变更而不增加层。答案:mounttype=cache。24.在Vue3.4中,将响应式对象`state`转为普通对象,应使用函数____。答案:toRaw。25.在HTTP/3中,传输层协议由TCP改为____。答案:QUIC。四、算法与程序设计(共45分)26.(10分)给定一棵n≤1e5个节点的无向树,边带权,q≤1e5次查询,每次给出(u,v,k),求u到v路径上第k小的边权。要求:在线算法,时间复杂度O((n+q)logn)。答案:1.对边权离散化并建立权值线段树合并结构。2.树链剖分或倍增找到LCA,将路径拆成u→LCA与v→LCA。3.对每条重链建立可持久化线段树,节点按入序插入边权。4.查询时在两棵线段树上同时二分,利用rank相减得到区间第k小。5.空间复杂度O(nlogn),单次查询O(logn)。27.(15分)实现一个线程安全的LRU缓存,支持get(k)、put(k,v),容量固定为C,要求get/put均摊O(1),内存无泄漏,用C++20实现。答案:```cppinclude<bits/stdc++.h>usingnamespacestd;template<typenameK,typenameV>classLRU{structNode{Kk;Vv;Nodepre,nxt;};unordered_map<K,Node>mp;unordered_map<K,Node>mp;Nodehead,tail;size_tcap;mutexmtx;voiddetach(Nodep){voiddetach(Nodep){p->pre->nxt=p->nxt;p->nxt->pre=p->pre;}voidpush_front(Nodep){voidpush_front(Nodep){p->nxt=head->nxt;p->pre=head;head->nxt->pre=p;head->nxt=p;}public:LRU(size_tc):cap(c){head=newNode{};tail=newNode{};head->nxt=tail;tail->pre=head;}~LRU(){clear();deletehead;deletetail;}voidclear(){lock_guard<mutex>g(mtx);for(auto&[k,p]:mp)deletep;mp.clear();head->nxt=tail;tail->pre=head;}optional<V>get(constK&k){lock_guard<mutex>g(mtx);autoit=mp.find(k);if(it==mp.end())returnnullopt;detach(it->second);push_front(it->second);returnit->second->v;}voidput(constK&k,constV&v){lock_guard<mutex>g(mtx);autoit=mp.find(k);if(it!=mp.end()){it->second->v=v;detach(it->second);push_front(it->second);return;}if(mp.size()==cap){Nodeold=tail->pre;Nodeold=tail->pre;detach(old);mp.erase(old->k);deleteold;}Nodep=newNode{k,v,nullptr,nullptr};Nodep=newNode{k,v,nullptr,nullptr};push_front(p);mp[k]=p;}};```测试:```cppintmain(){LRU<int,string>lru(2);lru.put(1,"a");lru.put(2,"b");cout<<lru.get(1)<<"\n";//acout<<lru.get(1)<<"\n";//alru.put(3,"c");//evict2cout<<lru.get(2).has_value()<<"\n";//0}```28.(20分)实现一个最小栈,支持push(x)、pop()、top()、getMin(),所有操作O(1),空间O(n),并给出形式化证明。答案:使用辅助栈保存当前最小值。```cppclassMinStack{stack<longlong>s,m;longlongoffset=0;public:voidpush(intx){if(s.empty()){s.push(0);m.push(x);offset=x;}else{longlongdiff=(longlong)x-offset;s.push(diff);if(x<m.top())m.push(x),offset=x;elsem.push(m.top());}}voidpop(){s.pop();m.pop();if(!m.empty())offset=m.top();}inttop(){longlongdiff=s.top();return(int)(diff+offset);}intgetMin(){return(int)m.top();}};```证明:1.辅助栈m.top()始终维护当前最小值,offset记录重基准。2.push时若新元素小于m.top(),则更新m与offset;否则m重复压入旧最小值。3.pop时同步弹出,offset回退到次小值。4.所有操作仅常数次栈操作,故O(1)。5.空间占用两个栈,各n元素,故O(n)。五、系统设计(共30分)29.(30分)设计一个支持千万级DAU的实时弹幕系统,要求:1.端到端延迟<100ms(P99)。2.支持房间人数百万级。3.支持弹幕点赞、举报、敏感词过滤。4.支持回放时弹幕时间轴精确到秒。答案:1.架构:a.边缘接入层:全球AnycastUDP+QUIC,用户就近接入边缘节点,节点部署在200+城市。b.边缘网关:基于Envoy,负责鉴权、限流、协议升级,将UDP弹幕转为内部gRPC。c.消息总线:边缘节点与中心之间使用自研MQ(基于Raft的日志流),保证区域间可靠投递。d.业务服务:弹幕服务:无状态,缓存房间最近30秒弹幕于本地RingBuffer,使用跳表+时间索引。点赞服务:异步累加,采用RedisHyperLogLog+周期合并。审核服务:敏感词AC自动机+深度学习模型(DistilBERT微调),GPU批处理,延迟<20ms。e.存储:热数据:RedisCluster,分片按roomId,使用RediSearch实现前缀查询。冷数据:TiDB按(room_id,ts)主键,冷热分离,7天后转S3+Parquet。f.回放:弹幕按1秒粒度聚合为segment文件,边缘CDN缓存,URL带版本号,支持Range请求。客户端缓存segment索引,播放时预加载下3秒数据。2.延迟优化:a.边缘节点使用eBPFXDP程序在网卡层过滤非法包,减少内核态切换。b.采用QUIC0-RTT复用,握手0RTT。c.消息序列化使用FlatBuffers,零拷贝反序列化。d.边缘节点本地时钟同步PTP,时间误差<100μs,确保弹幕时间戳全局一致。3.高可用:a.边缘节点宕机时,BGP自动将流量路由到邻近节点,客户端重连耗时<50ms。b.中心MQ跨区三副本,Raft选主<1s。c.RedisCluster采用双机房主从+哨兵,故障切换<5s。4.可扩展:a.边缘节点水平扩展,通过KubernetesHPA基于CPU+包量双指标弹性。b.房间维度分片,支持动态Rebalance,迁移时采用一致性哈希+虚拟节点,抖动<0.1%。5.安全:a.端到端加密:QUIC默认TLS1.3,附加房间级AES-GCM流加密,密钥通过ECDHE轮换。b.内容审核:实时流式检测,可疑弹幕先隐藏后人工复核,平均审核耗时<3s。6.回放一致性:a.弹幕写入时生成全局单调递增的snowflakeID,回放按ID排序,确保多端一致。b.客户端缓存segment哈希,防止CDN篡改。7.性能数据:a.单边缘节点8核25Gbps网卡可支撑100万并发长连接,每秒弹幕上行50万条。b.中心MQ单分片峰值吞吐500万条/秒,横向扩展100分片。六、手撕代码&现场调试(共30分)30.(30分)现场提供一台Ubuntu22.04笔记本,已安装Docker、Go1.22、Node20、Rust1.75、JetBrainsGateway。题目:背景:日志文件app.log每行一条JSON,字段有ts、level、msg,大小可达20GB,需在一台16核32GB机器上统计各级别日志条数,并按小时聚合输出CSV:hour,level,count。要求内存峰值<500MB,耗时<30秒。步骤与答案:1.方案选型:使用Rust内存映射+并行流。2.依赖:```toml[dependencies]memmap2="0.9"rayon="1.8"serde_json="1.0"chrono="0.4"```3.代码:```rustusestd::fs::File;usememmap2::Mmap;userayon::prelude::;userayon::prelude::;usestd::collections::HashMap;usechrono::{DateTime,Utc,Duration};fnmain()->Result<(),Box<dynstd::error::Error>>{letf=File::open("app.log")?;letmmap=unsafe{Mmap::map(&f)?};letmutmap:HashMap<(u64,u8),usize>=HashMap::new();letlines:Vec<&[u8]>=mmap.split(|&b|b==b'\n').collect();lines.par_chunks(10_000).for_each(|chunk|{letmutlocal=HashMap::new();forlineinchunk{

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论