版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年最新中级软件设计师下半年下午试题附答案解析1.阅读下列说明与Java代码,回答【问题1】至【问题3】,将答案填入答题纸对应栏内。【说明】某电商平台需要实现“秒杀”功能,要求同一商品在同一时刻只能被一个线程扣减库存,且必须保证库存不能为负。系统采用SpringBoot+MySQL8.0,数据库隔离级别为REPEATABLEREAD。商品表结构如下:goods(id,name,stock,version),其中version字段用于乐观锁。【Java代码片段】```java@ServicepublicclassSeckillService{@AutowiredprivateGoodsMappergoodsMapper;@TransactionalpublicbooleansecKill(LonggoodsId,Integerquantity){Goodsgoods=goodsMapper.selectById(goodsId);if(goods.getStock()<quantity)returnfalse;goods.setStock(goods.getStock()-quantity);introws=goodsMapper.updateStockByVersion(goods);returnrows==1;}}@MapperpublicinterfaceGoodsMapper{@Select("selectfromgoodswhereid={id}")GoodsselectById(Longid);@Update("updategoodssetstock={stock},version=version+1"+"whereid={id}andversion={version}")intupdateStockByVersion(Goodsgoods);}```【问题1】(5分)指出上述代码在高并发场景下可能存在的两个问题,并给出具体现象。【问题2】(6分)在不改变数据库隔离级别的前提下,重写updateStockByVersion方法,要求利用MySQL的“悲观锁”机制,保证同一行记录在同一时刻只能被一个事务更新,并给出SQL语句。【问题3】(4分)假设将version字段改为时间戳类型(精确到毫秒),请说明乐观锁是否仍然成立,并给出理由。答案与解析:【问题1】1.丢失更新:两个线程A、B同时读到stock=10,A扣减2后更新成功,B扣减3后也会成功,最终stock=5,实际应剩5,但A的更新被覆盖。2.超卖:由于select与update非原子,若100个线程并发,每个读到的stock都是10,理论上最多可卖出1000件,远超真实库存。【问题2】```sql@Update("updategoodssetstock=stock-{quantity},version=version+1"+"whereid={goodsId}andstock>={quantity}"+"andversion={version}"+"lockinsharemode")intupdateStockByVersion(@Param("goodsId")LonggoodsId,@Param("quantity")Integerquantity,@Param("version")Integerversion);```解析:lockinsharemode在REPEATABLEREAD下会升级为排他锁,保证同一行记录串行更新;同时把“stock>=quantity”判断放进同一SQL,避免业务层与数据层不一致。【问题3】不成立。毫秒时间戳在1ms内可产生大量并发,无法区分先后顺序;且分布式节点时钟可能不同步,导致version比较失效。---2.阅读下列说明与C++代码,回答【问题1】至【问题3】。【说明】某图形渲染引擎需要实现一个“场景图”管理器,支持动态添加、删除节点,并能在O(1)时间内获取任意节点的父节点。节点总数上限1e6。【C++代码片段】```cppclassNode{public:intid;Nodeparent;std::vector<Node>children;};classSceneGraph{std::unordered_map<int,Node>id2node;public:NodeaddNode(intid,intparentId){Nodep=nullptr;if(parentId!=-1){autoit=id2node.find(parentId);if(it==id2node.end())returnnullptr;p=it->second;}Nodenode=newNode{id,p};id2node[id]=node;if(p)p->children.push_back(node);returnnode;}NoderemoveNode(intid){autoit=id2node.find(id);if(it==id2node.end())returnnullptr;Nodevictim=it->second;if(victim->parent){auto&v=victim->parent->children;v.erase(std::remove(v.begin(),v.end(),victim),v.end());}for(Nodec:victim->children){c->parent=victim->parent;if(victim->parent)victim->parent->children.push_back(c);}id2node.erase(it);returnvictim;}};```【问题1】(4分)指出removeNode中两处内存泄漏风险,并给出修改方法。【问题2】(5分)若要求删除节点后自动释放内存,且不能破坏子节点,请重写removeNode,使用智能指针并保证仍可在O(1)内访问父节点。【问题3】(6分】现需支持“遍历场景图并计算包围盒”功能,包围盒采用AABB(轴对齐包围盒),每个节点存储本地AABB,父节点AABB为子节点并集。请给出后序遍历的伪代码,并说明时间复杂度。答案与解析:【问题1】1.victim节点本身未delete;2.子节点被移动到祖父节点后,原vector可能扩容,但旧内存未释放。修改:在erase后deletevictim;使用shrink_to_fit释放多余容量。【问题2】```cppclassNode:publicstd::enable_shared_from_this<Node>{public:intid;std::weak_ptr<Node>parent;std::vector<std::shared_ptr<Node>>children;};std::shared_ptr<Node>removeNode(intid){autoit=id2node.find(id);if(it==id2node.end())returnnullptr;autovictim=it->second;if(autop=victim->parent.lock()){auto&v=p->children;v.erase(std::remove(v.begin(),v.end(),victim),v.end());}for(auto&c:victim->children){c->parent=victim->parent;if(autop=victim->parent.lock())p->children.push_back(c);}id2node.erase(it);returnvictim;//调用端决定是否reset}```通过weak_ptr打破循环,O(1)访问父节点仍成立。【问题3】```cppAABBpostCalc(std::shared_ptr<Node>node){if(node->children.empty())returnnode->localAABB;AABBu;boolfirst=true;for(auto&c:node->children){AABBchildBox=postCalc(c);u=first?childBox:merge(u,childBox);first=false;}node->worldAABB=u;returnu;}```时间复杂度O(N),每个节点访问一次。---3.阅读下列数据库设计与SQL,回答【问题1】至【问题3】。【说明】某社交APP设计“用户关注”功能,需求:1.支持单向关注;2.查询用户A的所有粉丝列表;3.查询用户A关注的所有人;4.查询A、B是否互关。表结构:follow(id,follower_id,followee_id,created_at,UNIQUE(follower_id,followee_id))【问题1】(5分)给出查询“用户A的所有互关用户”的SQL,要求只返回用户ID,且避免重复。【问题2】(6分】若粉丝数可达1e7,请设计二级索引使上述三需求均走索引,并给出创建语句。【问题3】(4分】由于热点账号粉丝数巨大,现采用“关注列表分桶”策略:按followee_id哈希到16张表follow_0…follow_15。请说明如何在不改动业务SQL的前提下,利用MySQL分区透明实现,并给出分区键与分区函数。答案与解析:【问题1】```sqlSELECTf1.follower_idFROMfollowf1JOINfollowf2ONf1.follower_id=f2.followee_idANDf1.followee_id=f2.follower_idWHEREf1.followee_id=A;```【问题2】```sqlCREATEINDEXidx_followerONfollow(follower_id,followee_id);CREATEINDEXidx_followeeONfollow(followee_id,follower_id);```idx_follower覆盖需求3;idx_followee覆盖需求2;互关查询可用idx_followee快速定位A的被关注记录,再回表join。【问题3】```sqlALTERTABLEfollowPARTITIONBYKEY(followee_id)PARTITIONS16;```MySQL会对followee_id计算内部哈希,自动路由到对应分区,业务SQL无需改动。---4.阅读下列UML类图与Java代码,回答【问题1】至【问题3】。【说明】某嵌入式网关需要支持多种传感器协议(Modbus、CAN、MQTT),未来可扩展。系统采用策略模式,协议解析后统一封装为Metric对象(包含温度、湿度、压强)。类图:interfaceProtocolParser{List<Metric>parse(byte[]data);}classModbusParserimplementsProtocolParser{...}classCanParserimplementsProtocolParser{...}classMqttParserimplementsProtocolParser{...}网关主流程:1.串口读取一帧数据;2.根据帧头选择对应解析器;3.将Metric写入时序数据库InfluxDB。【问题1】(5分)若新增BACnet协议,请给出最小改动步骤,并说明符合OCP原则的理由。【问题2】(6分】现发现Modbus帧可能存在半包、粘包,请设计一个状态机,用Java代码实现分包,要求不阻塞串口读取线程。【问题3】(4分】Metric写入InfluxDB后,运维需要实时统计“过去1分钟平均温度”,但InfluxDB原始数据每秒上报一次。请给出连续查询(CQ)语句,降低查询延迟。答案与解析:【问题1】1.新建BacnetParser实现ProtocolParser;2.在工厂类Map中put("BACNET",newBacnetParser());3.无需修改原有任何代码,符合开闭原则。【问题2】```javaenumState{HEADER,LEN,PAYLOAD}classModbusDecoder{Statestate=HEADER;intlen;ByteBufbuf=ByteBufAllocator.DEFAULT.buffer();voiddecode(byte[]in,Consumer<byte[]>onFrame){buf.writeBytes(in);while(buf.readableBytes()>0){switch(state){caseHEADER:if(buf.readableBytes()<3)return;if(buf.getUnsignedByte(buf.readerIndex())==0x01&&buf.getUnsignedByte(buf.readerIndex()+1)==0x03){buf.skipBytes(2);state=LEN;}else{buf.readByte();//丢弃}break;caseLEN:if(buf.readableBytes()<1)return;len=buf.readUnsignedByte();state=PAYLOAD;break;casePAYLOAD:if(buf.readableBytes()<len+2)return;//+CRCbyte[]frame=newbyte[len+5];buf.readBytes(frame);onFrame.accept(frame);state=HEADER;break;}}}}```非阻塞,利用ByteBuf累积数据。【问题3】```sqlCREATECONTINUOUSQUERYcq_temp_1mONiot_dbBEGINSELECTmean(temperature)INTOtemp_1mFROMmetricGROUPBYtime(1m)END;```---5.阅读下列算法描述与C代码,回答【问题1】至【问题3】。【说明】某自动驾驶系统需要实时检测激光雷达点云中的地面,采用“区域生长+RANSAC”混合策略:1.将3D点云投影为2.5D栅格,每个栅格保存最低点的z值;2.选取种子栅格(本车周围-2m~+2m);3.区域生长连通高度差<0.2m的栅格;4.对生长结果用RANSAC拟合平面ax+by+cz+d=0;5.点到平面距离<0.1m则判为地面。【问题1】(5分】若栅格分辨率0.1m,检测范围前后各60m、左右各30m,计算总栅格数及占用内存(float32)。【问题2】(6分】给出区域生长的伪代码,要求用队列实现,并避免重复访问。【问题3】(4分】RANSAC迭代次数k与内点比例w、置信度p的关系为k=log(1-p)/log(1-w^3)。若要求p=0.999,初始w=0.6,计算k;若实际w仅0.3,求实际所需k,并说明如何在线自适应调整。答案与解析:【问题1】宽度=30×2/0.1=600,高度=60×2/0.1=1200,栅格数=720000,float32占4B,共2.88MB。【问题2】```cppqueue<Cell>q;set<Cell>visited;for(autoc:seedCells){q.push(c);visited.insert(c);}while(!q.empty()){Cellcur=q.front();q.pop();for(autonb:cur->neighbors4){if(visited.count(nb))continue;if(abs(nb->z-cur->z)<0.2f){visited.insert(nb);q.push(nb);}}}```【问题3】k1=log(1-0.999)/log(1-0.6^3)≈13;k2=log(1-0.999)/log(1-0.3^3)≈77;在线统计当前内点比例,动态更新k,保证实时性。---6.阅读下列分布式系统说明,回答【问题1】至【问题3】。【说明】某微服务采用SpringCloudGateway+JWT实现统一认证。JWTpayload包含userId、role、exp。网关需要实现“同一用户同时在线设备数不超过3”的限制。【问题1】(5分】给出一种基于Redis的滑动窗口方案,要求支持设备掉线自动过期,并给出核心Lua脚本。【问题2】(6分】若JWT过期时间30min,用户主动退出时需立即失效,请给出“黑名单”方案,要求网关不访问认证服务即可验证,并说明如何防止黑名单膨胀。【问题3】(4分】网关采用异步Netty线程池,突发流量下线程池队列可能爆掉,请给出一种背压机制,保证线程池满载时网关可优雅降级,返回503但不丢弃请求。答案与解析:【问题1】```lualocalkey="user:"..KEYS[1]localwindow=1800--30minlocalnow=ARGV[1]redis.call('zremrangebyscore',key,0,now-window)localcnt=redis.call('zcard',key)ifcnt>=3thenreturn0endredis.call('zadd',key,now,ARGV[2])redis.call('expire',key,window)return1```设备ID作为member,时间戳作为score,窗口外自动清理。【问题2】网关层维护RedisSetjwt:blacklist,JWT退出时把jti加入Set,设置过期30min;网关校验时先查Set,再验签。防止膨胀:Set带TTL,过期JWT自动淘汰。【问题3】采用Reactor的onBackpressureDrop策略,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地方文化旅游活动的宣传策略
- 2026海洋科普知识赛题试卷带答案
- 2026年吉林白城市中小学教师招聘考试题库及答案
- 2026年湖南省永州市中小学教师招聘考试考试题库(含答案)
- 2025年辽宁盘锦市中小学教师招聘考试试题题库(答案+解析)
- 人教部编版六年级下册习作:家乡的风俗一等奖教案
- 江西省万载县株潭中学高中语文 1 沁园春长沙教学设计 新人教版必修1
- 第一课 制作文本幻灯片教学设计小学信息技术(信息科技)四年级下册新世纪版
- 策划宣传合同
- 中国核工业集团校招试题及答案
- 2026年春季小学信息科技(甘肃版2021)四年级下册教学计划含进度表
- 工程建设标准强制性条文(房屋建筑部分)
- 建筑与小区雨水控制及利用工程技术规范
- 冲压检验制度及规范
- 湿地公园知识宣传课件
- 初中信息技术教育中生成式AI辅助教研决策的实践研究教学研究课题报告
- 第5章专题01平面向量及其应用(题型篇)(原卷版)
- 工厂车间手机管理制度
- 2025年浙江师范大学辅导员考试真题
- 房东委托开票法律文书模板
- DB34∕T 4465-2023 人力资源服务标准体系建设要求
评论
0/150
提交评论