2026年程序员面试宝典编程题及答案_第1页
2026年程序员面试宝典编程题及答案_第2页
2026年程序员面试宝典编程题及答案_第3页
2026年程序员面试宝典编程题及答案_第4页
2026年程序员面试宝典编程题及答案_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

2026年程序员面试宝典:编程题及答案一、算法设计题(共5题,每题10分)1.字符串反转(10分)编写一个函数,将输入的字符串反转,并返回反转后的结果。例如,输入`"hello"`,返回`"olleh"`。要求:-不使用内置的反转函数或库方法。-时间复杂度为O(n),空间复杂度为O(1)。2.字符串匹配(10分)实现一个简单的字符串匹配算法,判断模式串`pattern`是否出现在文本串`text`中。例如,`text="abcde"`,`pattern="ace"`,返回`true`;`pattern="acd"`,返回`false`。要求:-使用暴力匹配算法。-不使用KMP等高级算法。3.排序算法优化(10分)给定一个包含重复元素的整数数组,编写一个函数对其进行排序,要求时间复杂度为O(nlogn),空间复杂度为O(1)。示例:输入`[3,1,2,3,3,4,2]`,返回`[1,2,2,3,3,3,4]`。要求:-不能使用额外的数组或列表。-可选择快速排序或归并排序,并进行优化。4.数组去重(10分)给定一个整数数组,返回一个去重后的数组,其中相同的元素只保留一个。例如,输入`[1,2,2,3,4,4,5]`,返回`[1,2,3,4,5]`。要求:-不能使用额外的数据结构(如集合或字典)。-时间复杂度为O(n)。5.矩阵旋转(10分)给定一个n×n的二维矩阵,原地旋转矩阵90度。例如,输入`[[1,2,3],[4,5,6],[7,8,9]]`,旋转后为`[[7,4,1],[8,5,2],[9,6,3]]`。要求:-不能使用额外的矩阵。-时间复杂度为O(n²)。二、数据库设计题(共3题,每题10分)1.用户注册表设计(10分)设计一个用户注册表`users`,包含以下字段:-`user_id`(主键,自增)-`username`(唯一,非空)-`password`(非空,需加密存储)-`email`(唯一,非空)-`register_time`(注册时间,默认当前时间)-`last_login`(上次登录时间,可为空)要求:-说明字段的数据类型和约束。-提供创建表的SQL语句。2.订单表与商品表关联设计(10分)设计订单表`orders`和商品表`products`的关联关系,满足以下需求:-一个订单可包含多个商品,一个商品可出现在多个订单中(多对多关系)。-`orders`表包含`order_id`(主键)、`user_id`(外键关联用户表)、`order_time`等字段。-`products`表包含`product_id`(主键)、`name`、`price`等字段。要求:-设计中间表`order_items`,并说明其字段。-提供创建表的SQL语句。3.索引优化(10分)假设有一个销售表`sales`,包含字段:`sale_id`(主键)、`product_id`(外键)、`sale_date`(日期)、`quantity`(数量)。要求:-说明在哪些字段上创建索引可以提高查询效率,并解释原因。-写出创建索引的SQL语句。三、系统设计题(共3题,每题10分)1.简单秒杀系统设计(10分)设计一个秒杀系统的核心逻辑,要求:-支持高并发场景(如每秒上千次请求)。-防止超卖和恶意刷单。-主要流程包括:用户下单、库存扣减、支付验证。要求:-说明关键步骤的实现方式(如分布式锁、Redis缓存)。-提供伪代码或流程图说明。2.文件上传系统设计(10分)设计一个支持大文件上传的系统,要求:-支持断点续传。-分块上传并合并。-保证上传的文件唯一性和安全性。要求:-说明关键技术(如MD5校验、临时存储)。-提供主要流程的伪代码。3.消息推送系统设计(10分)设计一个简单的消息推送系统,要求:-支持多种推送渠道(如短信、App内推送)。-保证消息的可靠性和顺序性。-支持消息重试机制。要求:-说明消息队列的作用。-提供架构图或流程图说明。四、编程语言基础题(共5题,每题5分)1.Java内存模型(5分)简述Java内存模型(JMM)的三大特性(可见性、原子性、有界性),并举例说明。2.Python装饰器(5分)编写一个Python装饰器,用于记录函数的执行时间,并返回执行结果。3.JavaScript闭包(5分)解释JavaScript闭包的概念,并说明其应用场景。4.C++内存管理(5分)简述C++中的智能指针(如`std::unique_ptr`和`std::shared_ptr`)的作用和区别。5.Go协程(5分)简述Go协程(Goroutine)的特点,并说明其与线程的区别。答案及解析一、算法设计题1.字符串反转(10分)pythondefreverse_string(s:str)->str:result=['']len(s)fori,charinenumerate(s):result[len(s)-1-i]=charreturn''.join(result)示例print(reverse_string("hello"))#输出:"olleh"解析:-使用列表`result`存储反转后的字符,避免修改原字符串(不可变类型)。-遍历原字符串,将字符按倒序填充到`result`中。-时间复杂度O(n),空间复杂度O(n)。优化版(O(1)空间):pythondefreverse_string_inplace(s:str)->str:s=list(s)left,right=0,len(s)-1whileleft<right:s[left],s[right]=s[right],s[left]left+=1right-=1return''.join(s)解析:-直接在原字符串上交换字符,无需额外空间。-时间复杂度O(n),空间复杂度O(1)。2.字符串匹配(10分)pythondefcontains_pattern(text:str,pattern:str)->bool:n,m=len(text),len(pattern)ifm==0:returnTrueforiinrange(n-m+1):j=0whilej<mandtext[i+j]==pattern[j]:j+=1ifj==m:returnTruereturnFalse示例print(contains_pattern("abcde","ace"))#输出:Trueprint(contains_pattern("abcde","acd"))#输出:False解析:-暴力匹配:遍历文本串,对每个可能的起始位置,逐个比较模式串。-时间复杂度O(nm),最坏情况是n和m都很大。3.排序算法优化(10分)选择快速排序并优化:pythondefquick_sort(arr:list)->list:defpartition(left,right):pivot=arr[right]i=left-1forjinrange(left,right):ifarr[j]<=pivot:i+=1arr[i],arr[j]=arr[j],arr[i]arr[i+1],arr[right]=arr[right],arr[i+1]returni+1def_quick_sort(left,right):ifleft<right:pivot_index=partition(left,right)_quick_sort(left,pivot_index-1)_quick_sort(pivot_index+1,right)_quick_sort(0,len(arr)-1)returnarr示例print(quick_sort([3,1,2,3,3,4,2]))#输出:[1,2,2,3,3,3,4]解析:-快速排序的平均时间复杂度为O(nlogn),空间复杂度为O(logn)(递归栈)。-通过三数取中或随机化选择枢轴优化性能。-不能达到O(1)空间复杂度,但可使用原地排序。4.数组去重(10分)pythondefremove_duplicates(arr:list)->list:ifnotarr:return[]write_index=0forread_indexinrange(1,len(arr)):ifarr[read_index]!=arr[write_index]:write_index+=1arr[write_index]=arr[read_index]returnarr[:write_index+1]示例print(remove_duplicates([1,2,2,3,4,4,5]))#输出:[1,2,3,4,5]解析:-双指针法:`write_index`记录当前去重后的位置,`read_index`遍历数组。-时间复杂度O(n),空间复杂度O(1)。5.矩阵旋转(10分)pythondefrotate_matrix(matrix:list)->None:n=len(matrix)forlayerinrange(n//2):first,last=layer,n-1-layerforiinrange(first,last):offset=i-firsttop=matrix[first][i]matrix[first][i]=matrix[last-offset][first]matrix[last-offset][first]=matrix[last][last-offset]matrix[last][last-offset]=matrix[i][last]matrix[i][last]=top示例matrix=[[1,2,3],[4,5,6],[7,8,9]]rotate_matrix(matrix)print(matrix)#输出:[[7,4,1],[8,5,2],[9,6,3]]解析:-将矩阵分层旋转,每层按顺时针方向交换四个元素。-时间复杂度O(n²),空间复杂度O(1)。二、数据库设计题1.用户注册表设计(10分)sqlCREATETABLEusers(user_idINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)UNIQUENOTNULL,passwordVARCHAR(255)NOTNULL,--存储加密后的密码emailVARCHAR(100)UNIQUENOTNULL,register_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP,last_loginTIMESTAMPNULL);解析:-`user_id`自增且唯一,作为主键。-`username`和`email`唯一,防止重复注册。-`password`存储加密后的哈希值(如bcrypt)。-`register_time`默认当前时间,`last_login`可为空。2.订单表与商品表关联设计(10分)sql--订单表CREATETABLEorders(order_idINTAUTO_INCREMENTPRIMARYKEY,user_idINTNOTNULL,order_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP,FOREIGNKEY(user_id)REFERENCESusers(user_id));--商品表CREATETABLEproducts(product_idINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(100)NOTNULL,priceDECIMAL(10,2)NOTNULL);--中间表CREATETABLEorder_items(order_idINTNOTNULL,product_idINTNOTNULL,quantityINTNOTNULL,PRIMARYKEY(order_id,product_id),FOREIGNKEY(order_id)REFERENCESorders(order_id),FOREIGNKEY(product_id)REFERENCESproducts(product_id));解析:-`orders`表存储订单基本信息,`user_id`关联用户表。-`products`表存储商品信息。-`order_items`表实现多对多关系,包含`order_id`和`product_id`作为复合主键。3.索引优化(10分)sqlCREATEINDEXidx_product_dateONsales(product_id,sale_date);--或CREATEINDEXidx_date_productONsales(sale_date,product_id);解析:-查询通常按`product_id`和`sale_date`组合进行,创建复合索引可加速范围查询。-若查询常按`sale_date`排序,则索引顺序应为`sale_date`在前。-索引可减少全表扫描,提高查询效率。三、系统设计题1.简单秒杀系统设计(10分)流程:1.用户请求秒杀时,先检查Redis缓存中的库存是否为0,是则拒绝。2.若库存大于0,使用分布式锁(如RedisLua脚本)扣减库存。3.扣减成功后,写入订单表,并回调支付接口。4.支付成功则完成秒杀,否则取消订单扣回库存。伪代码:pythondefseckill(item_id,user_id):检查Redis库存stock=redis.get(f"stock:{item_id}")ifstock==0:return"库存不足"分布式锁lock=redis.set(f"lock:{item_id}","1",nx=True,ex=5)ifnotlock:return"请求太频繁"try:new_stock=int(stock)-1redis.set(f"stock:{item_id}",new_stock)创建订单order_id=create_order(user_id,item_id)支付ifpay(order_id):return"秒杀成功"else:redis.set(f"stock:{item_id}",new_stock+1)return"支付失败"finally:redis.delete(f"lock:{item_id}")解析:-Redis缓存用于快速判断库存,避免数据库压力。-分布式锁防止并发扣减库存。-订单和支付流程需保证原子性。2.文件上传系统设计(10分)流程:1.客户端分块上传文件(如1MB一块),每个块附带唯一ID和总块数。2.服务器存储块文件,使用临时目录避免冲突。3.客户端上传完毕后,服务器按顺序合并块文件。4.校验MD5哈希值,确保文件完整性。伪代码:pythondefupload_file(file_chunks,file_id,total_chunks):forchunk_id,chunkinenumerate(file_chunks):save_chunk(f"temp/{file_id}/chunk_{chunk_id}",chunk)ifverify_md5(file_id,file_chunks):merge_chunks(file_id,total_chunks)return"上传成功"else:return"文件损坏"解析:-分块上传支持断点续传,提高容错性。-合并时按块ID顺序操作,确保文件正确。-MD5校验保证上传文件未被篡改。3.消息推送系统设计(10分)架构:-消息生产者(应用)将消息发送到消息队列(如RabbitMQ或Kafka)。-消息队列持久化消息,确保可靠性。-消息消费者(推送服务)从队列获取消息,按渠道推送。-推送失败的消息进入重试队列,定时重试。流程图:应用->消息队列->推送服务->短信/推送||VV重试队列->推送服务解析:-消息队列解耦生产者和消费者,支持异步推送。-重试机制提高推送成功率。-可按优先级或渠道路由消息。四、编程语言基础题1.Java内存模型(5分)-可见性:一个线程对共享变量的修改,其他线程能立即得知。-示例

温馨提示

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

评论

0/150

提交评论