js算法面试题(附答案)
js算法面试题十道
- 两数之和
题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
function twoSum(nums, target) {const map = new Map();for (let i = 0; i < nums.length; i++) {const complement = target - nums[i];if (map.has(complement)) {return [map.get(complement), i];}map.set(nums[i], i);}return [];
}
- 反转字符串
题目:给你一个字符串 s,请你将它反转成一个新的字符串。
function reverseString(s) {return s.split('').reverse().join('');
}
- 最长公共子序列
题目:给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。
function longestCommonSubsequence(text1, text2) {const m = text1.length;const n = text2.length;const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));for (let i = 1; i <= m; i++) {for (let j = 1; j <= n; j++) {if (text1[i - 1] === text2[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}return dp[m][n];
}
- 合并两个有序数组
题目:给你两个有序整数数组 nums1 和 nums2,请你将它们合并成一个的新数组。你可以假设这个新数组的长度一定小于或等于 nums1.length + nums2.length。
function mergeTwoArrays(nums1, nums2) {const result = [];let i = 0;let j = 0;while (i < nums1.length && j < nums2.length) {if (nums1[i] < nums2[j]) {result.push(nums1[i]);i++;} else {result.push(nums2[j]);j++;}}return result.concat(nums1.slice(i)).concat(nums2.slice(j));
}
- 三数之和
题目:给你一个包含 n 个整数的数组 nums,判断是否可以通过在数组中选择一个起始点,然后向后选择两个整数,使得这三个整数的和等于目标值。
function threeSum(nums, target) {const result = [];nums.sort((a, b) => a - b);for (let i = 0; i < nums.length - 2; i++) {if (i > 0 && nums[i] === nums[i - 1]) continue;const left = i + 1;const right = nums.length - 1;while (left < right) {const sum = nums[i] + nums[left] + nums[right];if (sum === target) {result.push([nums[i], nums[left], nums[right]]);left++;right--;while (left < right && nums[left] === nums[left - 1]) left++;while (left < right && nums[right] === nums[right + 1]) right--;} else if (sum < target) {left++;} else {right--;}}}return result;
}
- 四数之和
题目:给你一个包含 n 个整数的数组 nums,判断是否可以使用其中的四个数来组成一个矩形。如果可以,返回 true;否则,返回 false。
function fourSum(nums, target) {const result = [];nums.sort((a, b) => a - b);for (let i = 0; i < nums.length - 3; i++) {if (i > 0 && nums[i] === nums[i - 1]) continue;for (let j = i + 1; j < nums.length - 2; j++) {if (j > i + 1 && nums[j] === nums[j - 1]) continue;const left = j + 1;const right = nums.length - 1;while (left < right) {const sum = nums[i] + nums[j] + nums[left] + nums[right];if (sum === target) {result.push([nums[i], nums[j], nums[left], nums[right]]);left++;right--;while (left < right && nums[left] === nums[left - 1]) left++;while (left < right && nums[right] === nums[right + 1]) right--;} else if (sum < target) {left++;} else {right--;}}}}return result;
}
- 两数之和 II - 输入有序数组
题目:给定一个已排序的整数数组 nums,找出两个数满足它们的和等于目标值 target。你只能使用每个元素一次。
function twoSumSorted(nums, target) {const map = new Map();for (let i = 0; i < nums.length; i++) {const complement = target - nums[i];if (map.has(complement)) {return [map.get(complement), i];}map.set(nums[i], i);}return [];
}
- 最大矩形面积
题目:给定一个二维数组 heights,其中 heights[i] 表示第 i 行的高度,返回能够勾勒出的最大矩形面积。
function largestRectangleArea(heights) {const stack = [];heights.push(0);let maxArea = 0;for (let i = 0; i < heights.length; i++) {while (stack.length && heights[stack[stack.length - 1]] > heights[i]) {const height = heights[stack.pop()];const width = stack.length === 0 ? i : i - stack[stack.length - 1] - 1;maxArea = Math.max(maxArea, height * width);}stack.push(i);}return maxArea;
}
- 盛最多水的容器
题目:给定 n 个非负整数 a1、a2、…、an,请计算连乘这些整数所得到的积,并以字符串形式输出。
function multiply(nums) {let result = '1';for (const num of nums) {result = BigInt(result) * BigInt(num);}return result.toString();
}
- 单词拆分 II
题目:给定一个非空字符串 s 和一个定义好的分隔符集合 nonWordChars,返回所有可能的句子排列。句子是由空格分隔的单词组成的。换句话说,要生成所有可能的句子,可以使用回溯算法进行求解。
function wordBreak(s, wordDict) {const result = [];const memo = new Map();function backtrack(start) {if (memo.has(start)) {return memo.get(start);}if (start === s.length) {result.push('');return;}for (let end = start + 1; end <= s.length; end++) {if (wordDict.has(s.slice(start, end))) {backtrack(end);if (end !== start + 1) {const sentences = result.pop();result.push(sentences + ' ' + s.slice(start, end));} else {result.push(s.slice(start, end));}}}memo.set(start, result);return result;}backtrack(0);return result;
}
再来十道经典面试题
以下是几个经典的 JavaScript 算法题和它们的详细答案:
- 冒泡排序
问题:请用 JavaScript 实现一个冒泡排序算法。
function bubbleSort(arr) {let len = arr.length;for (let i = 0; i < len - 1; i++) {for (let j = 0; j < len - 1 - i; j++) {if (arr[j] > arr[j + 1]) {let temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}return arr;
}
- 二分查找
问题:请用 JavaScript 实现一个二分查找算法。
function binarySearch(arr, target) {let left = 0;let right = arr.length - 1;while (left <= right) {let mid = Math.floor((left + right) / 2);if (arr[mid] === target) {return mid;} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;
}
- 深度优先搜索
问题:请用 JavaScript 实现一个深度优先搜索算法,用于遍历图或树。
function dfs(graph, start, visited = []) {visited.push(start);console.log(start);for (let next of graph[start]) {if (!visited.includes(next)) {dfs(graph, next, visited);}}
}
- 广度优先搜索
问题:请用 JavaScript 实现一个广度优先搜索算法,用于遍历图或树。
function bfs(graph, start, visited = []) {const queue = [start];while (queue.length > 0) {const node = queue.shift();if (!visited.includes(node)) {visited.push(node);console.log(node);for (const next of graph[node]) {queue.push(next);}}}
}
- 归并排序
问题:请用 JavaScript 实现一个归并排序算法。
function mergeSort(arr) {if (arr.length <= 1) return arr;const mid = Math.floor(arr.length / 2);const left = mergeSort(arr.slice(0, mid));const right = mergeSort(arr.slice(mid));return merge(left, right); // 合并两个有序数组,产生一个新的有序数组。需要额外实现 merge 函数。}function merge(left, right) {let result = [];let i = 0;let j = 0;while (i < left.length && j < right.length) {if (left[i] < right[j]) {result.push(left[i]);i++;} else {result.push(right[j]);j++;}}// 如果左边数组还有剩余元素,将其全部加入结果数组while (i < left.length) {result.push(left[i]);i++;}// 如果右边数组还有剩余元素,将其全部加入结果数组while (j < right.length) {result.push(right[j]);j++;}return result;
}
在这个实现中,我们首先创建一个空的结果数组。然后我们使用两个指针 i 和 j 分别指向左数组和右数组的第一个元素。我们比较两个指针所指的元素,并将较小的元素推入结果数组。这个过程一直持续到我们遍历完左数组和右数组的所有元素。然后,我们将剩余的元素(如果有的话)添加到结果数组中。最后,我们返回结果数组。
- 快速排序
问题:请用 JavaScript 实现一个快速排序算法。
答案:
function quickSort(arr) {if (arr.length <= 1) return arr;const pivot = arr[0];const left = [];const right = [];for (let i = 1; i < arr.length; i++) {if (arr[i] < pivot) {left.push(arr[i]);} else {right.push(arr[i]);}}return [...quickSort(left), pivot, ...quickSort(right)];
}
- 插入排序
问题:请用 JavaScript 实现一个插入排序算法。
答案:
function insertionSort(arr) {let i = 1;while (i < arr.length) {let key = arr[i];let j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;i++;}return arr;
}
- 选择排序
问题:请用 JavaScript 实现一个选择排序算法。
答案:
function selectionSort(arr) {let len = arr.length;for (let i = 0; i < len - 1; i++) {let minIndex = i;for (let j = i + 1; j < len; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}if (minIndex != i) {[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]; // Swap arr[i] and arr[minIndex]}}return arr; // 返回排序后的数组,从小到大排序。
}
- Fibonacci序列:问题:请用JavaScript实现一个函数,计算Fibonacci序列的第n个数字。答案:
function fibonacci(n) {if (n <= 1) {return n;}return fibonacci(n - 1) + fibonacci(n - 2);
}
- 二分查找改进版:问题:请用JavaScript实现一个函数,在有序数组中查找特定元素,并返回其索引。如果元素不存在,则返回-1。答案:
function binarySearch(arr, target) {let left = 0;let right = arr.length - 1;while (left <= right) {let mid = Math.floor((left + right) / 2);if (arr[mid] === target) {return mid;} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;
}
相关文章:
js算法面试题(附答案)
js算法面试题十道 两数之和 题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 function twoSum(nums, target) {const map new Map();for (let i 0; i < nums.leng…...
2023 年戴森设计大奖得主是谁?给大楼降温、争取救援机会
2023 年戴森设计大奖得主是谁?给大楼降温、争取救援机会 编辑拉风的极客2023/11/22 摘要 当今社会除了持续不断对科技创新保持注目,还有很多年轻发明家为了实际场景的难题提供解决方案。 11 月 15 日,2023 年戴森设计大奖国际大奖名单正…...
〖大前端 - 基础入门三大核心之JS篇㊲〗- DOM改变元素节点的css样式、HTML属性
说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作…...
【word技巧】Word制作试卷,ABCD选项如何对齐?
使用word文件制作试卷,如何将ABCD选项全部设置对齐?除了一直按空格或者Tab键以外,还有其他方法吗?今天分享如何将ABCD选项对齐。 首先,我们打开【替换和查找】,在查找内容输入空格,然后点击全部…...
OpenHarmony 4.1计划明年Q1发布, 5.0预计Q3发布
据HarmonyOS官方组织透露,OpenHarmony 4.0 版本已于 10 月 26 日正式发布,开发套件同步升级到 API 10。开放原子开源基金会现更新了 OpenHarmony 4.1&5.0 版本路线图。据介绍,OpenHarmony 4.1 Beta 版本预计将于年底完成测试并发布&#…...
蓝桥等考C++组别八级002
第一部分:选择题 1、C++ L8 (15分) 整数12,8的最小公倍数是( )。 A. 4 B. 16 C. 24 D. 48 正确答案:C 2、C+&#...
秋招JAVA面经总结
面试的范围是Java基础+Java并发+Java框架+mysql+网络。 Java基础 重载与重写有什么区别? 重载(Overloading)指的是在同一个类中,可以有多个同名方法,它们具有不同的参数列表(参数类型、参数个数或参数顺序不同),编译器根据调用时的参数类型来决定调用哪个方法。 重写…...
Postgresql源码(116)提升子查询案例分析
0 总结 对于SQL:select * from student, (select * from score where sno > 2) s where student.sno s.sno; pullup在pull_up_subqueries函数内递归完成,分几步: 将内层rte score追加到上层rtbable中:rte1是student、rte2带…...
CNP实现应用CD部署
上一篇整体介绍了cnp的功能,这篇重点介绍下CNP产品应用开发的功能。 简介 CNP的应用开发,主要是指的应用CD部署的配置管理。 应用列表,用来创建一个应用,一般与项目对应,也可以多个应用对应到一个项目。具体很灵活。…...
kubeadm join 192.168.10.16:6443 --token xxx报错Failed to request cluster-info
1、node节点执行 kubeadm join 192.168.10.16:6443 --token hak4zi.hrib9uv4p62t1uok --discovery-token-ca-cert-hash sha256:4337638eef783ee6a66045ad699722079e071c2dfbaa21e37d3174f04d58ea97 --v2 报错 [discovery] Failed to request cluster-info, will try again: G…...
车载以太网-传输层-TCP
文章目录 TCP协议TCP协议报文格式TCP报文的示例TCP建立连接TCP断开连接TCP协议测试TCP协议 车载以太网TCP协议是一种在车载以太网网络中使用的传输控制协议(TCP)。它是一种面向连接的协议,用于在车辆之间或车辆与基础设施之间传输数据。TCP协议提供了可靠的数据传输,确保数…...
java:简单入门定时任务的几种方式Timer、Quartz、Spring Task
背景 后端的定时任务在许多应用中都扮演着重要的角色,它们可用于处理重复性任务、执行定期操作或处理需要定时触发的任务。以下是一些使用场景的示例: 数据同步:在分布式系统中,不同系统之间经常需要进行数据同步。例如…...
木子-前端-方法标签属性小记(普通jsp/html篇)2023~2024
目录 1、如何在前端页面将base转成存进input的图片格式 2、通过前端页面判断当前使用方式PC端还是手机端的极简易方法 1、如何在前端页面将base转成存进input的图片格式 不是直接存进input里,只是将文件转成对应的格式。 data.picPath是base64编码,我…...
音视频项目—基于FFmpeg和SDL的音视频播放器解析(十七)
介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...
使用netty实现WebSocket协议通信
服务器与浏览器之间实现通信,一般都是由浏览器发起http请求,服务端对http请求进行响应,要实现服务端主动向浏览器推送数据,一般采用的方案都是websocket主动推送,或者前端实现轮询方式拉取数据,轮询方式多少…...
uniapp开发小程序,包过大解决方案
1、首先和大家说一下 微信小程序 主包限制不能超过2M 分包一共不能超过8M 然后具体解决优化步骤如下, 将主包进行分包 在pages.json 下subPackages里面进行配置分包 分包配置完 配置过的文件都需要进行修改对应的路径 2 、 在运行的时候 一定要勾选 压缩代码 有…...
Go语言中string与byte转换
简介 string与byte的转换是最常见的一种,通常我们会使用强转方式,但其实还有另一种更加高效的方式,本文会演示两种转换方式。 普通转换 func main() {fmt.Println([]byte("abcd"))fmt.Println(string([]byte{1, 2, 3})) }输出 […...
机器学习8:在病马数据集上进行算法比较(ROC曲线与AUC)
ROC曲线与AUC。使用不同的迭代次数(基模型数量)进行 Adaboost 模型训练,并记录每个模型的真阳性率和假阳性率,并绘制每个模型对应的 ROC 曲线,比较模型性能,输出 AUC 值最高的模型的迭代次数和 ROC 曲线。 …...
70. 爬楼梯 --力扣 --JAVA
题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 解题思路 通过对爬楼梯进行分解,爬到当前台阶的方式分为两种,即由上一个台阶通过爬1和上两个台阶爬2,同公…...
体感互动游戏VR游戏AR体感游戏软件开发
随着科技的不断发展,体感互动游戏正逐渐成为游戏行业的一个重要趋势。这类游戏通过利用传感器、摄像头和运动控制器等技术,使玩家能够通过身体动作与游戏进行实时互动,极大地提升了娱乐体验。 1. 游戏设计与互动元素 体感互动游戏的核心在于…...
保姆级避坑指南:在VMware Workstation 17上搞定macOS Ventura虚拟机(附Intel/AMD配置差异)
VMware Workstation 17上完美运行macOS Ventura虚拟机的终极指南 在Windows环境下运行macOS虚拟机一直是开发者和技术爱好者的热门需求,尤其是对于需要跨平台测试或体验苹果生态的用户。然而,这个过程充满了各种技术陷阱和兼容性问题。本文将深入探讨在V…...
为 Hermes Agent 配置 Taotoken 自定义供应商的详细步骤
为 Hermes Agent 配置 Taotoken 自定义供应商的详细步骤 Hermes Agent 是一个功能强大的 AI 代理开发框架,支持通过自定义供应商接入不同的模型服务。如果你正在使用 Taotoken 平台来统一管理和调用多种大模型,将其配置为 Hermes Agent 的自定义供应商是…...
OpenClaw智能体实战指南:从商业运营到个人效率的自动化落地
1. 项目概述:一份面向实干家的自主智能体用例全景图如果你正在寻找一个能帮你处理日常琐事、优化业务流程,甚至重塑个人工作流的“数字员工”,那么你很可能已经接触过“智能体”或“自主代理”这些概念。但概念归概念,如何将它们从…...
终极指南:3步解决Calibre中文路径变拼音问题,让你的电子书库重获清晰命名
终极指南:3步解决Calibre中文路径变拼音问题,让你的电子书库重获清晰命名 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文&…...
Hearthstone-Script完整指南:免费自动化你的炉石传说游戏体验
Hearthstone-Script完整指南:免费自动化你的炉石传说游戏体验 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script Hearthstone-Script是一款完全…...
FreeRTOS内核揭秘:它的任务调度器到底比Linux快在哪?(适合嵌入式进阶)
FreeRTOS内核调度机制深度解析:为何能在嵌入式领域碾压Linux? 在嵌入式开发领域,当工程师需要在资源受限的环境下实现硬实时响应时,FreeRTOS往往是比Linux更优的选择。这不仅仅因为它体积小巧,更源于其内核调度器设计的…...
从硬件到代码:手把手拆解DMA外挂的完整链条(含Apex实战代码分析)
从硬件到代码:手把手拆解DMA外挂的完整链条(含Apex实战代码分析) 在游戏安全领域,DMA(直接内存访问)技术正逐渐成为高端作弊工具的核心组件。这种原本用于工业数据采集的技术,因其能够绕过CPU直…...
科新永安电子锁-酒店门锁-幽冥大陆(一百19)—东方仙盟
门锁转换门锁常见故障自助解决2声---正确提示,表示是设置卡 3声---门锁已反锁,解决方法:用能开反锁的卡或解除反锁 6声---房号不对,解决方法:设置门锁的房号 7声---卡已过期,解决方法:设置门锁的…...
如何让老旧电视盒子变身4K媒体中心:从零开始的CoreELEC系统构建指南
如何让老旧电视盒子变身4K媒体中心:从零开始的CoreELEC系统构建指南 【免费下载链接】e900v22c-CoreELEC Build CoreELEC for Skyworth e900v22c 项目地址: https://gitcode.com/gh_mirrors/e9/e900v22c-CoreELEC 你是否有一台闲置的电视盒子,想要…...
怎么把DNG图片批量转换成JPG格式
DNG格式是 Adobe 公司开发的通用 RAW 图像格式。一般的电脑或者手机不支持直接阅读,并且给别人看的话也不太方便。那么如何把dng格式的图片转换成jpg或者png格式呢?第一步:浏览器打开星喵工具,找到里面的 DNG转JPG 的功能。…...
