版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年软考编码测试题及答案一、编程题(共5题,每题40分,总分200分)1.请编写一个函数,输入为一个整数数组nums(长度n≥1)和一个整数k(1≤k≤n),要求输出数组中长度为k的连续子数组的最大可能和。要求算法时间复杂度不超过O(n)。示例输入:nums=[2,-1,3,5,-2,4],k=3示例输出:11(对应子数组[3,5,-2]的和为3+5+(-2)=6?不,等一下,原数组是[2,-1,3,5,-2,4],k=3时,各子数组和为:2-1+3=4;-1+3+5=7;3+5-2=6;5-2+4=7。哦示例输出可能有误,应该调整示例。正确示例输入应为nums=[2,1,3,5,-2,4],k=3,此时子数组和为2+1+3=6,1+3+5=9,3+5-2=6,5-2+4=7,最大为9。或者重新设计示例:nums=[-2,1,-3,4,-1,2,1,-5,4],k=4。各子数组和:-2+1-3+4=0;1-3+4-1=1;-3+4-1+2=2;4-1+2+1=6;-1+2+1-5=-3;2+1-5+4=2。最大为6。所以正确示例输入:nums=[-2,1,-3,4,-1,2,1,-5,4],k=4,输出6。函数定义(Python):defmax_subarray_sum(nums:list[int],k:int)->int:2.给定一个字符串s,其中包含数字、加减乘除运算符(+、-、、/)和括号(()),要求编写一个函数计算该表达式的值。运算规则:除法仅保留整数部分(如4/3=1),括号优先级最高,乘除优先级高于加减,同级运算从左到右。示例输入:s="(3+52)/(2-13)"示例输出:-13(计算过程:括号内3+52=13,2-13=-1,13/-1=-13)函数定义(Python):defcalculate_expression(s:str)->int:3.某物流网络由m个仓库(编号0~m-1)和n条双向道路组成,每条道路有长度(正整数)。现需从仓库A出发,计算到仓库B的最短路径长度。若A和B不连通,返回-1。要求使用Dijkstra算法实现,图的输入格式为邻接表(每个仓库的邻接列表包含[相邻仓库,道路长度])。示例输入:m=5,n=7,A=0,B=4,邻接表如下:0:[[1,2],[2,5]]1:[[0,2],[2,1],[3,4]]2:[[0,5],[1,1],[3,2],[4,3]]3:[[1,4],[2,2],[4,1]]4:[[2,3],[3,1]]示例输出:5(路径0→1→2→4:2+1+3=6?或者0→2→3→4:5+2+1=8?或者0→1→3→4:2+4+1=7?正确最短路径应为0→1→2→4?不,邻接表中1的邻接有[2,1],所以0→1(2)→2(1)→4(3)总长2+1+3=6。或者检查是否有更短路径:0→2的邻接是5,2→4是3,总长5+3=8。1→3是4,3→4是1,所以0→1→3→4总长2+4+1=7。或者2→3是2,3→4是1,所以0→1→2→3→4:2+1+2+1=6。或者是否有更短?比如0→1→2→3→4是6,而0→2→3→4是5+2+1=8。或者是否有其他路径?比如0→1→3→4是2+4+1=7。所以正确最短路径是0→1→2→4?邻接表中2的邻接有[4,3],所以0→1(2)→2(1)→4(3)总长2+1+3=6。但示例输出可能需要调整,比如正确输出应为6。或者重新设计邻接表:比如仓库2到4的道路长度为2,则0→1→2→4总长2+1+2=5,此时输出5。函数定义(Python):defshortest_path(m:int,adj:list[list[list[int]]],A:int,B:int)->int:4.给定一个整数数组coins表示不同面额的硬币(硬币数量无限),和一个整数amount表示总金额。要求计算组成该金额的最少硬币数。若无法组成,返回-1。请使用动态规划实现,要求空间复杂度为O(amount)。示例输入:coins=[1,3,4],amount=6示例输出:2(3+3)函数定义(Python):defmin_coin_change(coins:list[int],amount:int)->int:5.给定一棵二叉树的根节点root和两个节点p、q,要求找到它们的最近公共祖先(LCA)。最近公共祖先定义为同时是p和q的祖先的节点中深度最大的那个。要求不使用递归,且不存储父节点信息。示例输入:二叉树结构如下(层序遍历表示):[3,5,1,6,2,0,8,null,null,7,4],p=5,q=4示例输出:5(因为5是4的祖先,且是5和4的公共祖先中最深的)树节点定义(Python):classTreeNode:def__init__(self,x):self.val=xself.left=Noneself.right=None函数定义(Python):deflowest_common_ancestor(root:TreeNode,p:TreeNode,q:TreeNode)->TreeNode:答案部分1.最大连续子数组和思路:滑动窗口法。计算初始窗口(前k个元素)的和,然后逐步向右滑动窗口:减去离开窗口的元素,加上进入窗口的元素,更新最大值。defmax_subarray_sum(nums:list[int],k:int)->int:n=len(nums)ifk>n:return0题目保证k≤n,可省略current_sum=sum(nums[:k])max_sum=current_sumforiinrange(k,n):current_sum+=nums[i]nums[ik]ifcurrent_sum>max_sum:max_sum=current_sumreturnmax_sum测试用例验证:输入nums=[-2,1,-3,4,-1,2,1,-5,4],k=4,初始窗口和为-2+1-3+4=0;下一个窗口:+(-1)-(-2)=0-1+2=1;再下一个:+2-1=1+1=2;再下一个:+1-(-3)=2+4=6;再下一个:+(-5)-4=6-9=-3;最后一个:+4-(-1)=-3+5=2。最大值为6,符合示例输出。2.表达式计算思路:使用双栈(操作数栈、运算符栈)处理优先级。遇到数字时拼接完整数值;遇到运算符时,若当前运算符优先级≤栈顶运算符,先计算栈顶运算;遇到左括号直接入栈;遇到右括号则计算直到左括号。defcalculate_expression(s:str)->int:s=s.replace("","")去除空格nums=[]操作数栈ops=[]运算符栈i=0n=len(s)priority={"+":1,"-":1,"":2,"/":2,"(":0}括号优先级特殊处理defcompute():b=nums.pop()a=nums.pop()op=ops.pop()ifop=="+":nums.append(a+b)elifop=="-":nums.append(ab)elifop=="":nums.append(ab)elifop=="/":nums.append(a//bifab>0else(a+(-a)%b)//b)处理负数除法(如-13/2=-6)whilei<n:c=s[i]ifc.isdigit():num=0whilei<nands[i].isdigit():num=num10+int(s[i])i+=1nums.append(num)continueifc=="(":ops.append(c)elifc==")":whileops[-1]!="(":compute()ops.pop()弹出左括号else:运算符whileopsandops[-1]!="("andpriority[c]<=priority[ops[-1]]:compute()ops.append(c)i+=1whileops:处理剩余运算符compute()returnnums[0]测试用例验证:输入s="(3+52)/(2-13)",处理过程:左括号入栈,3入数栈,+入栈,5入数栈,入栈(优先级高于+),2入数栈→计算52=10→数栈[3,10],+计算3+10=13→数栈[13],右括号弹出左括号。右括号后是/,入栈。左括号处理2-13:1入数栈,入栈,3入数栈→计算13=3→数栈[2,3],-计算2-3=-1→数栈[-1],右括号弹出左括号。最后计算13/(-1)=-13,符合示例输出。3.最短路径(Dijkstra算法)思路:使用优先队列(堆)存储(当前距离,节点),每次取出距离最小的节点,更新其邻接节点的距离。importheapqdefshortest_path(m:int,adj:list[list[list[int]]],A:int,B:int)->int:ifA==B:return0INF=float('inf')dist=[INF]mdist[A]=0heap=[]heapq.heappush(heap,(0,A))visited=[False]mwhileheap:current_dist,u=heapq.heappop(heap)ifvisited[u]:continuevisited[u]=Trueifu==B:returncurrent_distforv,winadj[u]:ifnotvisited[v]anddist[v]>current_dist+w:dist[v]=current_dist+wheapq.heappush(heap,(dist[v],v))return-1测试用例验证:邻接表调整为仓库2到4的道路长度为2(原示例可能路径更优),假设adj[2]包含[4,2],则路径0→1(2)→2(1)→4(2)总长2+1+2=5。堆处理过程:初始堆(0,0),弹出0,更新邻接节点1(距离2)、2(距离5)。堆中有(2,1),(5,2)。弹出1(距离2),更新邻接节点0(已访问)、2(当前距离5vs2+1=3→更新为3)、3(2+4=6)。堆变为(3,2),(5,2旧),(6,3)。弹出2(距离3),更新邻接节点0(已访问)、1(已访问)、3(3+2=5<6→更新)、4(3+2=5)。堆中有(5,3),(5,4)。弹出4(距离5),到达B=4,返回5,符合示例输出。4.最少硬币数(动态规划)思路:dp[i]表示组成金额i的最少硬币数。初始dp[0]=0,其余为无穷大。遍历每个金额,尝试用每个硬币更新更小的硬币数。defmin_coin_change(coins:list[int],amount:int)->int:ifamount==0:return0max_val=amount+1dp=[max_val](amount+1)dp[0]=0foriinrange(1,amount+1):forcincoins:ifc<=i:dp[i]=min(dp[i],dp[ic]+1)returndp[amount]ifdp[amount]!=max_valelse-1测试用例验证:coins=[1,3,4],amount=6。dp[0]=0;i=1:c=1→dp[1]=1;i=2:c=1→dp[2]=2;i=3:c=3→dp[3]=1;i=4:c=4→dp[4]=1;i=5:c=3→dp[5-3]+1=dp[2]+1=3;c=1→dp[4]+1=2→取2;i=6:c=3→dp[3]+1=2;c=4→dp[2]+1=3;c=1→dp[5]+1=3→取2,符合示例输出。5.最近公共祖先(非递归实现)思路:使用栈模拟后序遍历,记录每个节点的父节点关系(遍历时记录父节点),同时跟踪p和q的路径,找到最后一个公共节点。deflowest_common_ancestor(root:TreeNode,p:TreeN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年智能床底灯项目可行性研究报告
- 2026年中央空调计费系统项目公司成立分析报告
- 2026年导电聚合物生物电子项目可行性研究报告
- 2026年低空通信网络(C波段5G-A)项目可行性研究报告
- 2026年夜间经济消费场景项目公司成立分析报告
- 2026年人力资源培训SaaS系统项目公司成立分析报告
- 2026年二氧化碳驱替页岩气项目公司成立分析报告
- 2026年宠物远程问诊项目可行性研究报告
- 2026年政策影响下区块链技术开发合同协议
- 2026年人力资源管理师模拟卷人才招聘与员工培训
- 2026年东营职业学院单招综合素质笔试参考题库含详细答案解析
- 四川省泸州市2025-2026学年高一上学期期末质量监测化学试卷
- 初高中生物知识衔接课件
- 2024年风电、光伏项目前期及建设手续办理流程汇编
- 迈瑞售后管理制度规范
- 2026年护理质控工作计划
- 2025天津市水务规划勘测设计有限公司招聘18人笔试历年参考题库附带答案详解
- 皇家加勒比游轮介绍
- 胰腺常见囊性肿瘤的CT诊断
- 检测设备集成优化方案
- 煤矿春节后复工安全培训课件
评论
0/150
提交评论