版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年程序员F面试题及答案一、编程语言基础(5题,每题10分,共50分)1.题目:请用Java编写一个方法,实现将一个字符串中的所有空格替换为"%20"。要求时间复杂度为O(n),不使用额外的库函数。答案与解析:javapublicclassReplaceSpaces{publicstaticStringreplaceSpaces(Strings){if(s==null)returnnull;char[]chars=s.toCharArray();intspaceCount=0;//首先统计空格数量for(charc:chars){if(c=='')spaceCount++;}//创建新数组,长度为原字符串长度+2空格数量char[]newChars=newchar[chars.length+2spaceCount];intj=0;for(inti=0;i<chars.length;i++){if(chars[i]==''){newChars[j++]='%';newChars[j++]='2';newChars[j++]='0';}else{newChars[j++]=chars[i];}}returnnewString(newChars);}publicstaticvoidmain(String[]args){Stringinput="Wearehappy.";Stringoutput=replaceSpaces(input);System.out.println(output);//输出:We%20are%20happy.}}解析:-首先统计原字符串中的空格数量,因为每个空格需要替换为3个字符("%20")。-创建一个新数组,长度为原字符串长度+2空格数量。-遍历原字符串,遇到空格则在新数组中插入"%20",否则直接复制字符。-最后将新数组转换为字符串返回。2.题目:请用Python实现一个函数,判断一个链表是否为回文链表。链表节点定义如下:pythonclassListNode:def__init__(self,val=0,next=None):self.val=valself.next=next答案与解析:pythonclassListNode:def__init__(self,val=0,next=None):self.val=valself.next=nextdefisPalindrome(head:ListNode)->bool:ifnotheadornothead.next:returnTrue找到链表中间节点slow=headfast=headwhilefastandfast.next:slow=slow.nextfast=fast.next.next反转后半部分链表prev=Nonewhileslow:next_node=slow.nextslow.next=prevprev=slowslow=next_node比较前半部分和反转后的后半部分left,right=head,prevwhileright:#只需比较后半部分,因为前半部分已经比较完ifleft.val!=right.val:returnFalseleft=left.nextright=right.nextreturnTrue解析:-使用快慢指针找到链表的中间节点。-反转后半部分链表,使其与前半部分对称。-逐个比较前半部分和反转后的后半部分,若全部相等则为回文链表。-时间复杂度O(n),空间复杂度O(1)。3.题目:请用C++实现一个函数,统计一个二叉树中节点的最大深度。二叉树节点定义如下:cppstructTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(intx):val(x),left(nullptr),right(nullptr){}TreeNode(intx,TreeNodeleft,TreeNoderight):val(x),left(left),right(right){}};答案与解析:cppinclude<algorithm>structTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(intx):val(x),left(nullptr),right(nullptr){}TreeNode(intx,TreeNodeleft,TreeNoderight):val(x),left(left),right(right){}};intmaxDepth(TreeNoderoot){if(root==nullptr)return0;return1+std::max(maxDepth(root->left),maxDepth(root->right));}解析:-递归遍历二叉树,每访问一层深度加1。-递归终止条件为当前节点为空,返回0。-最终返回左右子树深度的最大值加1。4.题目:请用JavaScript实现一个函数,将一个非负整数转换为罗马数字。罗马数字的符号表示如下:-I:1-V:5-X:10-L:50-C:100-D:500-M:1000答案与解析:javascriptfunctionintToRoman(num){constvalueSymbols=[[1000,'M'],[900,'CM'],[500,'D'],[400,'CD'],[100,'C'],[90,'XC'],[50,'L'],[40,'XL'],[10,'X'],[9,'IX'],[5,'V'],[4,'IV'],[1,'I']];letresult='';for(let[value,symbol]ofvalueSymbols){while(num>=value){result+=symbol;num-=value;}}returnresult;}//示例console.log(intToRoman(3999));//输出:MMMCMXCIX解析:-使用数组按罗马数字的符号从大到小排列。-遍历数组,对于每个符号,尽可能多次减去对应的值,并将符号追加到结果中。-最终得到完整的罗马数字表示。5.题目:请用Go实现一个函数,检查一个字符串是否是有效的括号组合。例如:-输入:"()"→输出:true-输入:"(]"→输出:false答案与解析:gofuncisValid(sstring)bool{stack:=[]rune{}mapping:=map[rune]rune{')':'(','}':'{',']':'['}for_,char:=ranges{if_,exists:=mapping[char];exists{top:=stack[len(stack)-1]ifmapping[char]!=top{returnfalse}stack=stack[:len(stack)-1]}else{stack=append(stack,char)}}returnlen(stack)==0}//示例fmt.Println(isValid("()"))//输出:truefmt.Println(isValid("(]"))//输出:false解析:-使用栈来匹配括号。-遇到右括号时,检查栈顶是否为对应的左括号,若不是则无效。-遍历结束后,栈为空则有效,否则无效。二、算法与数据结构(5题,每题10分,共50分)6.题目:请用Java实现快速排序算法,并分析其时间复杂度。答案与解析:javapublicclassQuickSort{publicstaticvoidquickSort(int[]arr,intleft,intright){if(left>=right)return;intpivotIndex=partition(arr,left,right);quickSort(arr,left,pivotIndex-1);quickSort(arr,pivotIndex+1,right);}privatestaticintpartition(int[]arr,intleft,intright){intpivot=arr[right];inti=left-1;for(intj=left;j<right;j++){if(arr[j]<=pivot){i++;swap(arr,i,j);}}swap(arr,i+1,right);returni+1;}privatestaticvoidswap(int[]arr,inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}publicstaticvoidmain(String[]args){int[]arr={3,1,4,1,5,9,2,6};quickSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));//输出:[1,1,2,3,4,5,6,9]}}解析:-快速排序采用分治法,选择一个基准值(pivot),将数组分为两部分,左部分小于等于基准值,右部分大于基准值。-递归对左右部分进行排序。-时间复杂度:平均O(nlogn),最坏O(n²)(当基准值选择不均匀时)。7.题目:请用Python实现一个函数,找出数组中第三大的数。若数组中数字不足三个,则返回最大的数。答案与解析:pythondefthird_max(nums):first,second,third=float('-inf'),float('-inf'),float('-inf')fornuminnums:ifnum>first:first,second,third=num,first,secondeliffirst>num>second:second,third=num,secondelifsecond>num>third:third=numreturnthirdifthird!=float('-inf')elsefirst示例print(third_max([1,2,2,5,3,5]))#输出:2print(third_max([1,1]))#输出:1解析:-初始化三个变量表示前三大的数。-遍历数组,更新三个变量。-若第三大的数存在(不为负无穷),则返回;否则返回最大的数。8.题目:请用C++实现一个函数,合并两个有序链表,返回合并后的有序链表。链表节点定义如下:cppstructListNode{intval;ListNodenext;ListNode():val(0),next(nullptr){}ListNode(intx):val(x),next(nullptr){}ListNode(intx,ListNodenext):val(x),next(next){}};答案与解析:cppstructListNode{intval;ListNodenext;ListNode():val(0),next(nullptr){}ListNode(intx):val(x),next(nullptr){}ListNode(intx,ListNodenext):val(x),next(next){}};ListNodemergeTwoLists(ListNodel1,ListNodel2){ListNodedummy;ListNodetail=&dummy;while(l1&&l2){if(l1->val<l2->val){tail->next=l1;l1=l1->next;}else{tail->next=l2;l2=l2->next;}tail=tail->next;}tail->next=l1?l1:l2;returndummy.next;}解析:-使用虚拟头节点简化边界处理。-遍历两个链表,按顺序合并到新链表中。-时间复杂度O(n),空间复杂度O(1)。9.题目:请用JavaScript实现一个函数,找出数组中重复次数超过一半的数。若不存在,返回-1。答案与解析:javascriptfunctionmajorityElement(nums){letcount=0;letcandidate=null;for(letnumofnums){if(count===0){candidate=num;}count+=(num===candidate)?1:-1;}letmajorityCount=0;for(letnumofnums){if(num===candidate){majorityCount++;}}returnmajorityCount>nums.length/2?candidate:-1;}//示例console.log(majorityElement([3,2,3]));//输出:3console.log(majorityElement([2,2,1,1,1,2,2]));//输出:2解析:-使用摩尔投票法,候选者初始为null,计数为0。-遍历数组,若计数为0则更新候选者,若当前数等于候选者则计数加1,否则减1。-最后验证候选者是否为多数元素。10.题目:请用Go实现一个函数,找出无重复字符的最长子串的长度。答案与解析:gofunclengthOfLongestSubstring(sstring)int{maxLen:=0charMap:=make(map[rune]int)left:=0forright,char:=ranges{iflastIdx,exists:=charMap[char];exists&&lastIdx>=left{left=lastIdx+1}charMap[char]=rightmaxLen=max(maxLen,right-left+1)}returnmaxLen}funcmax(a,bint)int{ifa>b{returna}returnb}//示例fmt.Println(lengthOfLongestSubstring("abcabcbb"))//输出:3解析:-使用滑动窗口技术,左指针和右指针分别表示窗口的左右边界。-使用哈希表记录字符上一次出现的位置。-遍历字符串,若字符重复且在窗口内,则移动左指针。-更新最大长度。三、系统设计(3题,每题10分,共30分)11.题目:设计一个简单的URL短缩服务,要求:1.输入一个长URL,返回一个短URL。2.支持短URL重定向回原URL。答案与解析:-核心思想:使用自增ID作为映射,结合Base62编码缩短ID长度。-步骤:1.生成一个全局唯一ID(如数据库自增)。2.将ID编码为Base62(a-z,A-Z,0-9),如100→"fU"。3.将短URL与原URL存储到数据库(key-value)。4.重定向时,根据短URL解析出原URL。-示例:-原URL:`/long-url`→ID:100→短URL:`/fU`。-重定向时,`/fU`查询数据库,返回`/long-url`。12.题目:设计一个高并发的短链接系统,要求支持秒杀场景。答案与解析:-核心架构:-分布式ID生成器(如Twitter的Snowflake算法),保证全局唯一性。-缓存层(Redis),存储短URL与原URL的映射,加速查询。-数据库(如MySQLCluster),存储持久化数据。-负载均衡(Nginx),分发请求到多个后端节点。-秒杀优化:-使用限流(令牌桶算法)防止数据库过载。-异步写入,先缓存后写入数据库。-预热缓存,提前加载热门短链接。13.题目:设计一个新闻推荐系统,要求:1.用户行为数据(点击、点赞)实时写入。2.每秒更新一次推荐列表。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《GBT 20255.6-2008硬质合金化学分析方法 火焰原子吸收光谱法 一般要求》专题研究报告深度
- 《GBT 9822-2008粮油检验 谷物不溶性膳食纤维的测定》专题研究报告
- 《FZT 72013-2022服用经编间隔织物》专题研究报告
- 道路安全教育培训计划课件
- 道路安全培训资格证课件
- 道路保洁安全培训课件
- 2026年江苏高考化学考试卷含答案
- 2026年福建漳州市高职单招数学试题及答案
- 2026年广东汕尾市高职单招数学考试题库(含答案)
- 迪士尼安全培训内容课件
- 2026年生物医药创新金融项目商业计划书
- 湖南名校联考联合体2026届高三年级1月联考化学试卷+答案
- 井下爆破安全培训课件
- 2026年安全员证考试试题及答案
- 山东省潍坊市2024-2025学年二年级上学期期末数学试题
- 空气源热泵供热工程施工方案
- 合伙车辆分车协议书
- 中国马克思主义与当代2024版教材课后思考题答案
- 2026年日历表(每月一页、可编辑、可备注)
- GB 46520-2025建筑用绝热材料及制品燃烧性能安全技术规范
- 医院车队冬季安全培训课件
评论
0/150
提交评论