【面试】盘点10个高频的前端算法题,你全都会了吗?

前言

 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步!

 🍅 个人主页:南木元元

现在前端的面试中,算法出现的频率越来越高了,大厂更是必考算法 。本文就来分享一下10个常见的前端算法题,重要的地方已添加注释,如有不正确的地方,欢迎多多指正。


目录

1.合并两个有序数组

2.两数之和

3.三数之和

4.反转链表

5.全排列

6.有效的括号

7.二叉树的中序遍历

8.翻转二叉树

9.K个一组翻转链表

10.最长递增子序列

结语


1.合并两个有序数组

题目:给定两个非递减的有序数组nums1和nums2,合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。

示例:

来源:LeetCode第88题

代码实现:

//方法1:将nums2放到nums1的尾部,然后直接对整个数组进行排序
var merge = function (nums1, m, nums2, n) {nums1.splice(m, n, ...nums2);nums1.sort((a, b) => a - b);
};//方法2:逆向双指针,从后往前遍历
var merge = function (nums1, m, nums2, n) {let i = m - 1,j = n - 1,k = m + n - 1;while (i >= 0 || j >= 0) {if (i < 0) {nums1[k--] = nums2[j--];} else if (j < 0) {nums1[k--] = nums1[i--];} else if (nums1[i] <= nums2[j]) {nums1[k--] = nums2[j--];} else {nums1[k--] = nums1[i--];}}return nums1;
};

2.两数之和

题目:给定一个数组nums和一个目标值target,在数组中找出和为目标值的两个数,并返回下标。

示例:

来源:LeetCode第1题

代码实现:

// 哈希法,利用map
var twoSum = function (nums, target) {let map = new Map();// 遍历当前元素,并在map中寻找是否有匹配的keyfor (let i = 0; i < nums.length; i++) {if (map.has(target - nums[i])) {return [i, map.get(target - nums[i])];} else {// 没找到与当前匹配的元素,就把当前元素及对应下标加入mapmap.set(nums[i], i);}}
};

3.三数之和

题目:给你一个包含 n 个整数的数组 nums,判断nums中是否存在三个元素a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

示例:

来源:LeetCode第15题

代码实现:

// 双指针法
var threeSum = function (nums) {let res = [];//排序nums.sort((a, b) => a - b);for (let i = 0; i < nums.length; i++) {//如果当前第一个数大于0直接返回resif (nums[i] > 0) {return res;}//对第一个元素去重if (i > 0 && nums[i] === nums[i - 1]) {continue;}let l = i + 1;let r = nums.length - 1;while (l < r) {if (nums[i] + nums[l] + nums[r] > 0) {r--;} else if (nums[i] + nums[l] + nums[r] < 0) {l++;} else {res.push([nums[i], nums[l], nums[r]]);// 对第2、3个元素去重while (l < r && nums[l] === nums[l + 1]) {l++;}while (l < r && nums[r] === nums[r - 1]) {r--;}l++;r--;}}}return res;
};

4.反转链表

题目:给你一个单链表的头节点head,反转单链表。

示例:

来源:LeetCode第206题

代码实现:

// 1.双指针法,只需要改变链表的next指针的指向
var reverseList = function(head) {let p = null;let q = head;let tmp = null; //保存下一个节点while(q) {tmp = q.next;q.next = p;p = q;q = tmp;}return p;
};// 2.递归法
var reverseList = function(head) {var reverse = function(p, q) {if(q === null) {return p;}let tmp = q.next;q.next = p;p = q;return reverse(p, tmp); //注意这里必须return}return reverse(null, head);
};

5.全排列

题目:给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

来源:LeetCode第46题

实现代码:

// 回溯
var permute = function (nums) {let res = [];let path = [];var bt = function (used) {if (path.length === nums.length) {res.push([...path]);return;}for (let i = 0; i < nums.length; i++) {//used数组,记录此时path里已经选择的元素,一个排列里一个元素只能使用一次if (used[i] === 1) {continue;}path.push(nums[i]);used[i] = 1;bt(used);used[i] = 0;path.pop();}};bt([]);return res;
};

6.有效的括号

题目:给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

示例:

来源:LeetCode第20题

实现代码:

var isValid = function (s) {let stack = [];for (let i = 0; i < s.length; i++) {if (s[i] === "(") {stack.push(")");} else if (s[i] === "{") {stack.push("}");} else if (s[i] === "[") {stack.push("]");} else {//栈为空,说明多了右括号if (stack.length === 0 || stack.pop() !== s[i]) {return false;}}}//遍历结束栈还有元素,说明多了左括号return stack.length !== 0 ? false : true;
};

7.二叉树的中序遍历

题目:给定一个二叉树的根节点root,返回它的中序遍历。

示例:

来源:LeetCode第94题

代码实现:

// 1.递归
法var preorderTraversal = function (root) {let res = [];var dfs = function (root) {if (!root) {return;}dfs(root.left); //左res.push(root.val); //中dfs(root.right); //右};dfs(root);return res;
};// 2.迭代法(重点)
var inorderTraversal = function (root) {if (!root) {return [];}let res = [];let stack = [];//定义一个指针,指向当前遍历节点let cur = root; while (cur || stack.length) {if (cur) {//一直遍历到左下stack.push(cur);cur = cur.left;} else {cur = stack.pop();res.push(cur.val);cur = cur.right;}}return res;
};

8.翻转二叉树

题目:给你一棵二叉树的根节点root,翻转这棵树,并返回其根节点。

示例:

来源:LeetCode第102题

代码实现:

// 1.递归,先交换根节点左右子树,再分别对左右子树进行处理
var invertTree = function (root) {if (!root) {return root;}let tmp = root.left;root.left = root.right;root.right = tmp;invertTree(root.left);invertTree(root.right);return root;
};// 2.迭代
var invertTree = function(root) {let stack = [];if(root == null) {return root;}stack.push(root);while(stack.length != 0) {let node = stack.pop();if(node != null) {if(node.right) {stack.push(node.right); }if(node.left) {stack.push(node.left);  }stack.push(node);   stack.push(null);} else {let cur = stack.pop();  //每遍历一个节点,就交换它的左右子树[cur.left, cur.right] = [cur.right, cur.left];  }}return root;
};

9.K个一组翻转链表

题目:给你一个链表的头节点head,每k个节点一组进行翻转,返回修改后的链表。

示例:

来源:LeetCode第25题

代码实现:

var reverse = function (head, tail) {let prev = tail.next;let p = head;while (prev !== tail) {let tmp = p.next;p.next = prev;prev = p;p = tmp;}return [tail, head];
};
var reverseKGroup = function (head, k) {let vnode = new ListNode(0, head);let pre = vnode;while (head) {let tail = pre;// 查看剩余部分长度是否大于等于 kfor (let i = 0; i < k; i++) {tail = tail.next;if (!tail) {return vnode.next;}}let tmp = tail.next;//反转每个子链表[head, tail] = reverse(head, tail);// 把子链表重新接回原链表pre.next = head;tail.next = tmp;pre = tail;head = tmp;}return vnode.next;
};

10.最长递增子序列

题目:给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

示例:

来源:LeetCode第300题

代码实现:

var lengthOfLIS = function(nums) {let dp = new Array(nums.length).fill(1);for(let i = 1; i < nums.length; i++) {for(let j = 0; j < i; j++) {if(nums[i] > nums[j]) {dp[i] = Math.max(dp[i], dp[j] + 1);}}}return Math.max(...dp);
};

题目扩展:给你一个整数数组 nums ,找出其最长严格递增子序列。

示例:

实现代码:

function lengthOfLIS(nums) {if (!nums.length) return [];let dp = new Array(nums.length).fill(1);for (let i = 0; i < nums.length; i++) {for (let j = 0; j < i; j++) {if (nums[j] < nums[i]) {dp[i] = Math.max(dp[i], dp[j] + 1);}}}//最长递增子序列的长度let max = Math.max(...dp); let result = [];//倒序遍历,每次根据当前长度去获取数组中对应下标的值放入结果数组for (let i = max; i >= 1; i--) {// 找到符合条件最后一项的下标,这样才能保证数组的顺序是正确的let index = dp.lastIndexOf(i); // 存储对应的值,插入结果数组的最前面result.unshift(nums[index]); // 对dp进行截取,保证只取最大项之前的数据dp.length = index + 1; }return result;
}

结语

🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下博主~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/684462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符输入/输出和输入验证 DAY19

文章目录 前言一、单字符I/O二、缓冲区为什么要引入缓冲区&#xff1f;文件结尾补充**注意几点** 重定向和文件重定向输入cmd是什么&#xff1f;重定向输出组合重定向小试牛刀&#xff1a;文件输出 创建更友好的用户界面使用缓冲输入 如果您发现文章有错误请与我留言&#xff0…

STM32,嵌入式系统中的I2C协议

I2C协议——读写EEPROM 关注我&#xff0c;共同交流&#xff0c;一起成长 前言一、协议简介二、I2C特性及架构三、通信过程 前言 这是一种主要用于集成电路和集成电路&#xff08;IC&#xff09;通信&#xff0c;计算机中复杂的问题大多数就是用分层来进行解决&#xff0c;这个…

OpenAI 文生视频大模型Sora,看完别说WC啊

OpenAI&#xff0c;发布了他们的文生视频大模型Sora&#xff08;Sora 是一个 AI 模型&#xff0c;可以根据文本指令创建现实且富有想象力的场景&#xff09; 来感受下震撼视觉冲击&#xff0c;看看你有没有说WC… 地址&#xff1a;sora 提示&#xff1a;一位时尚女性走在充满…

51单片机项目(30)——基于51单片机的心率血氧脉搏检测的proteus仿真

1.功能设计 可以测量脉搏、心率、血氧浓度、体温&#xff0c;并且实时显示在LCD1602屏幕上&#xff0c;&#xff08;第一行是体温血氧&#xff0c;第二行是心率脉搏&#xff09;。 &#xff08;需要完整源文件的&#xff0c;直接看最后一节&#xff09; 另外&#xff0c;还…

开源软件的影响力:塑造数字世界的无形之手

随着科技的飞速发展&#xff0c;开源软件已经成为了推动数字世界发展的重要力量。它不仅改变了软件开发的传统模式&#xff0c;还对整个科技行业乃至社会产生了深远的影响。在这篇文章中&#xff0c;我们将探讨开源软件的影响力以及它如何塑造我们的数字世界。 一、开源软件的…

蓝桥杯电子类单片机提升一——超声波测距

前言 单片机资源数据包_2023 一、超声波测距原理 二、超声波测距的应用 1.超声波的发射 2.单片机知识补充&#xff1a;定时器 3.超声波的接收与计时 4.距离的计算 1&#xff09;定时器1为16位自动重载&#xff0b;1T11.0592MHz 2&#xff09;定时器1为16位自动重载&am…

Peter算法小课堂—哈希与哈希表

额……字符串我们是第一次学&#xff0c;给大家铺一些基础的不能再基础的基础&#xff0c; 字符串比较大小 字符串大小的比较&#xff0c;不是以字符串的长度直接决定&#xff0c;而是从最左边第一个字符开始比较&#xff0c;大者为大&#xff0c;小者为小&#xff0c;若相等…

[01] Vue2学习准备

目录 vue理解创建实例插值表达式 {{}}响应式特性 vue理解 Vue.js 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 创建实例 准备容器 <div id…

嵌入式中I2C 相关的硬件问题汇总及死锁解决办法

本文主要介绍如何解决I2C设备硬件设计上的各种问题&#xff0c;希望对大家有所帮助&#xff01; 关于I2C协议详细的讲解&#xff0c;可以参考之前的推文&#xff1a;全面解析 I2C 通信协议 一般情况下&#xff0c; i2c 设备焊接没什么问题&#xff0c;按照设备手册一步步来&a…

Github 2024-02-15 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-02-15统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量TypeScript项目4Python项目2Solidity项目2Rust项目1JavaScript项目1Go项目1C项目1 Terraform: 以安全和可预测…

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——JAVA

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 1. Java 1. 和 equals的区别 比较基本数据类型是比较的值&#xff0c;引用数据类型是比较两个是不是同一个对象&#xff0c;也就是引用是否指向同 一个对象&…

[职场] 优质简历怎么做 #学习方法#笔记

优质简历怎么做 简历是求职的“敲门砖”&#xff0c;直接影响着求职成败。然而&#xff0c;不少求职者对简历不太重视&#xff0c;认为简历就是写自己的经历。因此&#xff0c;在招聘现场&#xff0c;常会看到这样的简历&#xff1a;有的是从某招聘网站直接下载而来&#xff0c…

kali无线渗透之用wps加密模式破解出wpa模式的密码12

WPS(Wi-Fi Protected Setup&#xff0c;Wi-Fi保护设置)是由Wi-Fi联盟推出的全新Wi-Fi安全防护设定标准。该标准推出的主要原因是为了解决长久以来无线网络加密认证设定的步骤过于繁杂之弊病&#xff0c;使用者往往会因为步骤太过麻烦&#xff0c;以致干脆不做任何加密安全设定&…

基于FPGA的OFDM基带发射机的设计与实现

文章目录 前言一、OFDM描述二、本系统的实现参照 1.IEEE 802.11a协议主要参数2.不同调制方式与速率 3. IFFT映射关系4. IEEE 802.11a物理层规范5. PPDU帧格式三、设计与实现 1.扰码2.卷积编码与删余3.数据交织4.符号调制5.导频插入6.IFFT变换 7.循环前缀&加窗8.训练序列生成…

LocaSpace Viewer图新地球 4.4.9工程版授权

LocaSpace Viewer图新地球是一个独特的三维数字地球软件&#xff0c;它不用安装&#xff0c;且是一个轻量级的软件&#xff0c;永久授权激活&#xff0c;没有功能方面的限制&#xff0c;在这里&#xff0c;你可以根据需要进行各种操作&#xff0c;如获取多种在线地图资源&#…

Kubernetes安装部署 2

Kubeadm创建集群 如上所示&#xff0c;在阿里云的香港地域的ECS服务器上拉取下载Kubernetes官方提供的容器镜像 如上所示&#xff0c;在阿里云的香港地域的ECS服务器保存镜像到本地 Node A服务器的IP地址&#xff1a;192.168.0.130 端口号6443开放、部署Docker容器引擎、支持cr…

linux系统zabbix监控分布式监控的部署

分布式监控 服务器安装分布式监控安装工具安装mysql导入数据结构配置proxy端浏览器配置 zabbix server端监控到大量zabbix agent端&#xff0c;这样会使zabbix server端压力过大&#xff0c;使用zabbix proxy进行分布式监控 服务器安装分布式监控 安装工具 rpm -Uvh https://…

【C语言】简单贪吃蛇实现保姆级教学!!!

关注小庄 顿顿解馋૮(˶ᵔ ᵕ ᵔ˶)ა 新年快乐呀小伙伴 引言&#xff1a; 小伙伴们应该都有一个做游戏的梦吧&#xff1f;今天让小庄来用C语言简单实现一下我们的童年邪典贪吃蛇&#xff0c;顺便巩固我们的C语言知识&#xff0c;请安心食用~ 文章目录 贪吃蛇效果一.游戏前工作…

拿捏单链表

目录 引言 一&#xff1a;链表的定义 二&#xff1a;单链表的定义 三&#xff1a;单链表的增删查改 1.单链表增删查改及遍历的声明 注&#xff1a;在测试中创建指向头结点的指针plist 2.二级指针应用的说明 3.单链表的遍历 4.创建节点 5.单链表的插入 (1)头插 …

防御保护--内容安全过滤

目录 文件过滤 内容过滤技术 邮件过滤技术 应用行为控制技术 DNS过滤 URL过滤 防火墙 ---- 四层会话追踪技术 入侵防御 ---- 应用层深度检测技术 深度包检测深度流检测 随着以上俩种的成熟与完善&#xff0c;提出了所谓的内容安全过滤 当然上网行为确实需要治理&…