2026年程序员必看面试笔试编程题集_第1页
2026年程序员必看面试笔试编程题集_第2页
2026年程序员必看面试笔试编程题集_第3页
2026年程序员必看面试笔试编程题集_第4页
2026年程序员必看面试笔试编程题集_第5页
已阅读5页,还剩28页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

2026年程序员必看面试笔试编程题集一、编程语言基础(共5题,每题10分,总分50分)1.Java面向对象编程题目:编写一个Java类`Employee`,包含私有属性`id`(整数)、`name`(字符串)、`salary`(浮点数),并实现以下功能:(1)构造方法,初始化所有属性;(2)`toString()`方法,返回格式化的字符串(如`"Employee{id=100,name=张三,salary=8000.0}"`);(3)`increaseSalary(doublepercentage)`方法,根据百分比增加工资;(4)编写测试类`TestEmployee`,创建一个`Employee`对象,打印其信息,然后调用`increaseSalary(10)`,再打印新信息。答案:javapublicclassEmployee{privateintid;privateStringname;privatedoublesalary;publicEmployee(intid,Stringname,doublesalary){this.id=id;=name;this.salary=salary;}@OverridepublicStringtoString(){return"Employee{id="+id+",name='"+name+"',salary="+salary+'}';}publicvoidincreaseSalary(doublepercentage){salary=(1+percentage/100);}publicstaticvoidmain(String[]args){Employeeemp=newEmployee(100,"张三",8000.0);System.out.println(emp);emp.increaseSalary(10);System.out.println(emp);}}解析:-私有属性确保封装性,通过构造方法初始化;-`toString()`方法需符合题目格式要求;-`increaseSalary()`通过数学运算实现工资增长;-测试类演示对象创建和业务方法调用。2.Python异常处理题目:编写一个函数`safe_divide(a,b)`,实现除法运算,若`b`为0则抛出`ValueError`,否则返回商。在主程序中调用该函数,使用`try-except`捕获异常并打印错误信息。答案:pythondefsafe_divide(a,b):ifb==0:raiseValueError("除数不能为0")returna/btry:result=safe_divide(10,0)print("结果:",result)exceptValueErrorase:print("错误:",e)解析:-`raise`抛出自定义异常;-`try-except`区分正常流程和异常处理;-实际面试中可能要求记录异常日志。3.JavaScript闭包题目:解释闭包的概念,并编写代码实现一个简单的计数器函数,每次调用`increment()`返回当前计数值。答案:javascriptfunctioncreateCounter(){letcount=0;returnfunctionincrement(){return++count;};}constcounter=createCounter();console.log(counter());//1console.log(counter());//2解析:-外部函数`createCounter`定义变量`count`;-内部函数`increment`可以访问`count`,形成闭包;-每次调用`counter()`都会修改`count`。4.C++内存管理题目:使用`new`和`delete`动态创建一个包含5个整数的数组,初始化为1到5,然后反转数组元素(如`[1,2,3,4,5]`变为`[5,4,3,2,1]`),最后释放内存。答案:cppinclude<iostream>usingnamespacestd;intmain(){intarr=newint[5];for(inti=0;i<5;++i)arr[i]=i+1;//反转数组for(inti=0;i<2;++i){swap(arr[i],arr[4-i]);}for(inti=0;i<5;++i)cout<<arr[i]<<'';//输出:54321delete[]arr;return0;}解析:-`new`分配数组内存,`delete[]`释放;-双指针法反转数组(也可用循环);-注意`delete[]`必须与`new[]`对应。5.Go协程题目:编写一个Go程序,创建3个协程分别打印"Hello"、"World"、"!",要求按顺序输出(如`HelloWorld!`)。答案:gopackagemainimport("fmt""sync")funcprintWord(wordstring,wgsync.WaitGroup){deferwg.Done()fmt.Print(word,"")}funcmain(){varwgsync.WaitGroupwg.Add(3)goprintWord("Hello",&wg)goprintWord("World",&wg)goprintWord("!",&wg)wg.Wait()fmt.Println()}解析:-`sync.WaitGroup`控制协程同步;-`go`关键字启动协程;-`wg.Done()`标记协程完成。二、数据结构与算法(共5题,每题10分,总分50分)6.堆排序实现题目:不使用现成库函数,实现堆排序算法对整数数组进行升序排序。答案:javapublicclassHeapSort{publicstaticvoidheapSort(int[]arr){intn=arr.length;//构建最大堆for(inti=n/2-1;i>=0;i--){heapify(arr,n,i);}//逐个提取元素for(inti=n-1;i>0;i--){swap(arr,0,i);heapify(arr,i,0);}}privatestaticvoidheapify(int[]arr,intn,inti){intlargest=i;intleft=2i+1;intright=2i+2;if(left<n&&arr[left]>arr[largest])largest=left;if(right<n&&arr[right]>arr[largest])largest=right;if(largest!=i){swap(arr,i,largest);heapify(arr,n,largest);}}privatestaticvoidswap(int[]arr,inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}publicstaticvoidmain(String[]args){int[]arr={12,11,13,5,6,7};heapSort(arr);for(intnum:arr)System.out.print(num+"");//输出:567111213}}解析:-堆排序时间复杂度O(nlogn);-`heapify()`维护堆性质;-交换堆顶与末尾元素,缩小堆范围。7.二分查找变种题目:给定一个有序数组和一个目标值,返回目标值最后一次出现的索引。若不存在返回-1。答案:pythondeflast_occurrence(arr,target):left,right=0,len(arr)-1result=-1whileleft<=right:mid=left+(right-left)//2ifarr[mid]==target:result=midleft=mid+1elifarr[mid]<target:left=mid+1else:right=mid-1returnresult示例print(last_occurrence([1,2,2,2,3],2))#输出:3解析:-与普通二分查找区别在于找到目标后继续向右搜索;-使用`result`记录最新索引。8.图的最短路径题目:给定无向图邻接矩阵,使用Dijkstra算法求从顶点0到所有顶点的最短路径。答案:javaimportjava.util.Arrays;publicclassDijkstra{publicstaticint[]dijkstra(int[][]graph,intsrc){intn=graph.length;int[]dist=newint[n];boolean[]visited=newboolean[n];Arrays.fill(dist,Integer.MAX_VALUE);dist[src]=0;for(inti=0;i<n-1;i++){//找到未访问的最小距离顶点intminDist=Integer.MAX_VALUE;intu=-1;for(intj=0;j<n;j++){if(!visited[j]&&dist[j]<minDist){minDist=dist[j];u=j;}}if(u==-1)break;visited[u]=true;//更新邻接顶点for(intv=0;v<n;v++){if(graph[u][v]!=0&&!visited[v]&&dist[u]!=Integer.MAX_VALUE&&dist[u]+graph[u][v]<dist[v]){dist[v]=dist[u]+graph[u][v];}}}returndist;}publicstaticvoidmain(String[]args){int[][]graph={{0,2,0,6,0},{2,0,3,8,5},{0,3,0,0,7},{6,8,0,0,9},{0,5,7,9,0}};System.out.println(Arrays.toString(dijkstra(graph,0)));//[0,2,5,6,7]}}解析:-使用贪心策略选择最小距离顶点;-动态更新邻接顶点的距离;-时间复杂度O(n²),适合稠密图。9.递归与迭代题目:编写一个函数,用递归和迭代两种方式实现计算阶乘n!(n≥0)。答案:python递归deffactorial_recursive(n):ifn==0:return1returnnfactorial_recursive(n-1)迭代deffactorial_iterative(n):result=1foriinrange(2,n+1):result=ireturnresult测试print(factorial_recursive(5))#输出:120print(factorial_iterative(5))#输出:120解析:-递归依赖函数调用栈;-迭代使用循环,空间复杂度O(1)。10.顺时针打印矩阵题目:给定m×n矩阵,按顺时针方向打印所有元素。答案:javapublicclassSpiralMatrix{publicstaticList<Integer>spiralOrder(int[][]matrix){List<Integer>result=newArrayList<>();if(matrix==null||matrix.length==0)returnresult;inttop=0,bottom=matrix.length-1;intleft=0,right=matrix[0].length-1;while(top<=bottom&&left<=right){//从左到右for(intj=left;j<=right;j++){result.add(matrix[top][j]);}top++;//从上到下for(inti=top;i<=bottom;i++){result.add(matrix[i][right]);}right--;if(top<=bottom){//从右到左for(intj=right;j>=left;j--){result.add(matrix[bottom][j]);}bottom--;}if(left<=right){//从下到上for(inti=bottom;i>=top;i--){result.add(matrix[i][left]);}left++;}}returnresult;}publicstaticvoidmain(String[]args){int[][]matrix={{1,2,3},{4,5,6},{7,8,9}};System.out.println(spiralOrder(matrix));//[1,2,3,6,9,8,7,4,5]}}解析:-使用四指针(top/bottom/left/right)控制边界;-分四步移动指针并收集元素。三、数据库与SQL(共5题,每题10分,总分50分)11.SQL查询优化题目:表`orders`(`order_id`,`customer_id`,`order_date`,`status`)和`customers`(`customer_id`,`name`),写SQL查询:-查询2023年12月状态为"已完成"的客户订单数,按订单数降序排列;-若订单数为0,订单数显示为0。答案:sqlSELECT,COALESCE(SUM(CASEWHENo.status='已完成'THEN1ELSE0END),0)ASorder_countFROMcustomerscLEFTJOINordersoONc.customer_id=o.customer_idWHEREo.order_dateBETWEEN'2023-12-01'AND'2023-12-31'GROUPBYORDERBYorder_countDESC;解析:-`LEFTJOIN`确保即使客户无订单也能显示;-`COALESCE`处理订单数为0的情况;-日期范围过滤和聚合排序。12.SQL分组与窗口函数题目:表`sales`(`sale_id`,`product_id`,`region`,`amount`,`sale_date`),写SQL:-按产品分组,计算每个产品的总销售额;-使用窗口函数计算每个产品在各区域销售额的占比(四舍五入到2位小数)。答案:sqlWITHproduct_salesAS(SELECTproduct_id,SUM(amount)AStotal_amount,region,ROUND(SUM(amount)100.0/total_amount,2)ASpercentageFROMsalesGROUPBYproduct_id,region,total_amount)SELECTproduct_id,region,total_amount,percentageFROMproduct_salesORDERBYproduct_id,region;解析:-首先计算每个产品的总销售额;-然后计算占比(需要先获取总销售额作为分母);-注意窗口函数在此场景需配合子查询使用。13.SQL事务与锁题目:假设表`accounts`(`id`,`balance`),编写SQL实现转账操作:-从账户A向账户B转账100元;-若A余额不足,操作失败并回滚;-若成功,更新两个账户余额。答案:sqlBEGINTRANSACTION;--检查余额SELECTbalanceINTO@balanceAFROMaccountsWHEREid='A';IF@balanceA<100BEGINROLLBACK;SELECT'余额不足'ASmessage;END;END;--执行转账UPDATEaccountsSETbalance=balance-100WHEREid='A';UPDATEaccountsSETbalance=balance+100WHEREid='B';COMMIT;解析:-使用事务保证原子性;-先检查账户A余额;-实际应用中需处理死锁(如使用SELECTFORUPDATE)。14.SQL子查询与连接题目:表`employees`(`emp_id`,`name`,`department_id`)和`departments`(`dept_id`,`dept_name`),写SQL:-查询每个部门员工平均年龄,仅显示员工人数大于5的部门;-部门名称按字母升序排列。答案:sqlSELECTd.dept_name,AVG(e.age)ASavg_ageFROMemployeeseJOINdepartmentsdONe.department_id=d.dept_idGROUPBYd.dept_nameHAVINGCOUNT(e.emp_id)>5ORDERBYd.dept_name;解析:-使用`JOIN`关联员工和部门;-`GROUPBY`按部门分组,`HAVING`筛选条件;-排序确保结果可读性。15.SQL索引优化题目:表`orders`有100万条数据,查询`WHEREcustomer_id=?ANDorder_dateBETWEEN?AND?`性能慢,如何优化?答案:sql--创建组合索引CREATEINDEXidx_customer_dateONorders(customer_id,order_date);--查询示例SELECTFROMordersWHEREcustomer_id=101ANDorder_dateBETWEEN'2023-01-01'AND'2023-12-31';解析:-创建覆盖索引(包含查询列);-索引顺序重要:先选择性高的列(如`customer_id`);-考虑使用分区表(按日期分区)。四、系统设计与架构(共5题,每题10分,总分50分)16.缓存策略题目:设计一个新闻推荐系统缓存方案:(1)描述缓存场景(哪些数据适合缓存);(2)选择LRU或LFU策略并说明理由;(3)给出Redis实现伪代码。答案:text(1)缓存场景:-用户首页推荐内容(热点新闻)-商品详情页(高频访问)-订单信息(短时间内多次查询)(2)选择LRU:-新闻推荐场景中,用户近期浏览的内容更重要-LRU淘汰最久未使用项,符合热点数据特性(3)Redis实现:setnews:<user_id>:<item_id><score>EX3600NXincrbynews:<user_id>:<item_id>1zrevrangenews:<user_id>0-1withscores解析:-缓存需考虑数据时效性和访问频率;-LRU适合此场景;-Redis结合set和zset实现。17.微服务拆分题目:某电商平台(商品、订单、支付、物流)采用微服务架构,回答:(1)如何拆分"商品"模块的接口;(2)商品模块与其他模块的异步通信方案。答

温馨提示

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

评论

0/150

提交评论