LeetCode高频面试题及详细答案(面试专用)_第1页
LeetCode高频面试题及详细答案(面试专用)_第2页
LeetCode高频面试题及详细答案(面试专用)_第3页
LeetCode高频面试题及详细答案(面试专用)_第4页
LeetCode高频面试题及详细答案(面试专用)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

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

文档简介

LeetCode高频面试题及详细答案(面试专用)说明:本次整理均为互联网校招、社招高频手撕算法题,包含题目解析、思路分析、完整可运行代码、复杂度分析,写法贴合真实面试手写习惯,无冗余套话,适配绝大多数技术岗位算法面试。语言统一使用Java。一、两数之和(LeetCode1)1.题目描述给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。2.解题思路暴力双层循环时间复杂度太高,面试不推荐。最优解法使用哈希表,遍历数组的同时,用哈希表存储「数值-下标」映射。每遍历一个元素,先判断target-当前值是否存在于哈希表中,存在则直接返回对应下标,不存在则存入当前数据。全程只需要一次遍历,效率极高。3.完整代码java

importjava.util.HashMap;

importjava.util.Map;

publicclassSolution{

publicint[]twoSum(int[]nums,inttarget){

Map<Integer,Integer>map=newHashMap<>();

for(inti=0;i<nums.length;i++){

//计算需要匹配的差值

intdiff=target-nums[i];

//差值存在,说明之前遍历过,直接返回结果

if(map.containsKey(diff)){

returnnewint[]{map.get(diff),i};

}

//不存在则存入当前数值和下标

map.put(nums[i],i);

}

//题目保证有唯一解,此处仅为语法兜底

returnnewint[]{};

}

}4.复杂度分析时间复杂度:O(n),仅遍历数组一次,哈希表查询和插入为O(1)。空间复杂度:O(n),最坏情况存储全部数组元素。二、有效的括号(LeetCode20)1.题目描述给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合;左括号必须以正确的顺序闭合;每个右括号都有一个对应的相同类型的左括号。2.解题思路经典栈场景题目,括号匹配遵循后进先出原则。遍历字符串,遇到左括号就把对应的右括号压入栈;遇到右括号时,判断栈是否为空、栈顶元素是否和当前字符一致,不匹配直接返回false;匹配则弹出栈顶元素。遍历结束后,栈为空说明全部匹配成功,否则无效。3.完整代码java

importjava.util.Stack;

publicclassSolution{

publicbooleanisValid(Strings){

Stack<Character>stack=newStack<>();

for(charc:s.toCharArray()){

//左括号压入对应右括号

if(c=='('){

stack.push(')');

}elseif(c=='{'){

stack.push('}');

}elseif(c=='['){

stack.push(']');

}else{

//右括号:栈空或栈顶不匹配,直接失败

if(stack.isEmpty()||stack.pop()!=c){

returnfalse;

}

}

}

//栈空代表全部匹配完成

returnstack.isEmpty();

}

}4.复杂度分析时间复杂度:O(n),n为字符串长度,单次遍历。空间复杂度:O(n),最坏情况全为左括号,栈存储全部字符。三、反转链表(LeetCode206)1.题目描述给你单链表的头节点head,请你反转链表,并返回反转后的链表头节点。2.解题思路面试必考基础链表题,首选迭代法,逻辑简单、无栈溢出风险。核心思路:用两个指针记录前驱节点和当前节点,遍历链表时,逐个反转当前节点的指向,每次只改变一个节点的next指针,最后返回新的头节点。3.完整代码java

classListNode{

intval;

ListNodenext;

ListNode(){}

ListNode(intval){this.val=val;}

ListNode(intval,ListNodenext){this.val=val;this.next=next;}

}

publicclassSolution{

publicListNodereverseList(ListNodehead){

ListNodepre=null;

ListNodecur=head;

while(cur!=null){

//暂存下一个节点

ListNodenext=cur.next;

//反转当前节点指向

cur.next=pre;

//前驱、当前节点后移

pre=cur;

cur=next;

}

//pre为反转后的头节点

returnpre;

}

}4.复杂度分析时间复杂度:O(n),遍历所有链表节点一次。空间复杂度:O(1),仅使用常数额外空间,原地反转。四、最大子数组和(LeetCode53)1.题目描述给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。2.解题思路经典动态规划/贪心题目,面试首选贪心解法。核心逻辑:遍历数组,维护当前子数组和,如果当前累加和小于0,说明前面的部分只会拖累后续结果,直接舍弃,重新从当前元素开始累加;同时全程记录遍历过程中出现的最大值。3.完整代码java

publicclassSolution{

publicintmaxSubArray(int[]nums){

intres=nums[0];

intsum=0;

for(intnum:nums){

//累加和为负则舍弃,重新开始

if(sum>0){

sum+=num;

}else{

sum=num;

}

//更新最大值

res=Math.max(res,sum);

}

returnres;

}

}4.复杂度分析时间复杂度:O(n),单次数组遍历。空间复杂度:O(1),常数变量存储结果和累加和。五、合并两个有序链表(LeetCode21)1.题目描述将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。2.解题思路使用虚拟头节点简化边界判断,避免处理空链表的复杂场景。同时遍历两个链表,每次取出值较小的节点接入新链表,对应链表指针后移。其中一个链表遍历完毕后,直接拼接剩余链表节点,最终返回虚拟头节点的下一个节点。3.完整代码java

classListNode{

intval;

ListNodenext;

ListNode(){}

ListNode(intval){this.val=val;}

ListNode(intval,ListNodenext){this.val=val;this.next=next;}

}

publicclassSolution{

publicListNodemergeTwoLists(ListNodelist1,ListNodelist2){

//虚拟头节点

ListNodedummy=newListNode(-1);

ListNodecur=dummy;

while(list1!=null&&list2!=null){

if(list1.val<=list2.val){

cur.next=list1;

list1=list1.next;

}else{

cur.next=list2;

list2=list2.next;

}

cur=cur.next;

}

//拼接剩余节点

cur.next=list1==null?list2:list1;

returndummy.next;

}

}4.复杂度分析时间复杂度:O(m+n),m、n为两个链表长度,遍历所有节点一次。空间复杂度:O(1),仅常数空间,原地拼接链表。六、移动零(LeetCode283)1.题目描述给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。必须在原数组上操作,不能拷贝额外的数组。2.解题思路双指针经典题型。慢指针记录非零元素应该存放的位置,快指针遍历数组寻找非零元素。遍历过程中,快指针找到非零值后,和慢指针位置交换,随后慢指针后移。遍历结束后,所有非零元素前置,零元素自动留在数组末尾。3.完整代码java

publicclassSolution{

publicvoidmoveZeroes(int[]nums){

intslow=0;

for(intfast=0;fast<nums.length;fast++){

//快指针找到非零元素,交换

if(nums[fast]!=0){

inttemp=nums[slow];

nums[slow]=nums[fast];

温馨提示

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

评论

0/150

提交评论