js算法面试题(附答案)

js算法面试题十道

  1. 两数之和

题目:给定一个整数数组 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 [];
}
  1. 反转字符串

题目:给你一个字符串 s,请你将它反转成一个新的字符串。

function reverseString(s) {return s.split('').reverse().join('');
}
  1. 最长公共子序列

题目:给定两个字符串 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];
}
  1. 合并两个有序数组

题目:给你两个有序整数数组 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));
}
  1. 三数之和

题目:给你一个包含 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;
}
  1. 四数之和

题目:给你一个包含 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;
}
  1. 两数之和 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 [];
}
  1. 最大矩形面积

题目:给定一个二维数组 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;
}
  1. 盛最多水的容器

题目:给定 n 个非负整数 a1、a2、…、an,请计算连乘这些整数所得到的积,并以字符串形式输出。

function multiply(nums) {let result = '1';for (const num of nums) {result = BigInt(result) * BigInt(num);}return result.toString();
}
  1. 单词拆分 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 算法题和它们的详细答案:

  1. 冒泡排序
    问题:请用 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;
}
  1. 二分查找
    问题:请用 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;
}
  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);}}
}
  1. 广度优先搜索
    问题:请用 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);}}}
}
  1. 归并排序
    问题:请用 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;
}

在这个实现中,我们首先创建一个空的结果数组。然后我们使用两个指针 ij 分别指向左数组和右数组的第一个元素。我们比较两个指针所指的元素,并将较小的元素推入结果数组。这个过程一直持续到我们遍历完左数组和右数组的所有元素。然后,我们将剩余的元素(如果有的话)添加到结果数组中。最后,我们返回结果数组。

  1. 快速排序
    问题:请用 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)];
}
  1. 插入排序
    问题:请用 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;
}
  1. 选择排序
    问题:请用 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; // 返回排序后的数组,从小到大排序。
}
  1. Fibonacci序列:问题:请用JavaScript实现一个函数,计算Fibonacci序列的第n个数字。答案:
function fibonacci(n) {if (n <= 1) {return n;}return fibonacci(n - 1) + fibonacci(n - 2);
}
  1. 二分查找改进版:问题:请用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;
}

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

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

相关文章

Java中如何使用雪花算法生成唯一ID

雪花算法&#xff08;Snowflake ID&#xff09;是 Twitter 开源的一种分布式 ID 生成算法&#xff0c;其目的是生成全局唯一的 ID。该算法的核心思想是将一个 64 位的二进制数字分成几个部分&#xff0c;每个部分表示不同的信息&#xff0c;例如数据中心ID、机器ID、序列号等。…

BUUCTF 梅花香之苦寒来 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 注意&#xff1a;得到的 flag 请包上 flag{} 提交 密文&#xff1a; 下载附件&#xff0c;解压得到一张.jpg图片。 解题思路&#xff1a; 1、用010 Editor看了一下&#xff0c;刚开始以为是修改宽高的题&#xff…

羊大师教你如何有效解决工作中的挑战与压力?

在现代社会&#xff0c;工作问题一直是许多人头疼的难题。无论是从工作压力到职业发展&#xff0c;工作问题不仅会影响个人的心理健康&#xff0c;还可能对整个工作团队的效率和和谐产生负面影响。因此&#xff0c;如何有效解决工作问题成为了每个职场人士都需要面对的挑战。 …

Web前端—移动Web第四天(vw适配方案、vw和vh的基本使用、综合案例-酷我音乐)

版本说明 当前版本号[20231122]。 版本修改说明20231122初版 目录 文章目录 版本说明目录移动 Web 第四天01-vw适配方案vw和vh基本使用vw布局vh布局混用问题 02-综合案例-酷我音乐准备工作头部布局头部内容搜索区域banner 区域标题公共样式排行榜内容推荐歌单布局推荐歌单内…

Cuda out of memory原因以及解决办法

Cuda out of memory原因以及解决办法 文章目录 Cuda out of memory原因以及解决办法batch_size设置过大 batch_size设置过大 最近在做对抗训练方面的实验&#xff0c;当batch_size设置为256的时候&#xff0c;出现cuda out of memory. 当将batch_size修改为128时&#xff0c;则…

mysql使用--连接查询

1.连接查询 如&#xff1a;SELECT * FROM t1, t2; 上述FROM语句将t1表&#xff0c;t2表连接。 假设t1表含n条记录&#xff0c;t2表含m条记录&#xff0c;则t1, t2得到的表将包含n*m条记录。 我们以一个混合连接&#xff0c;过滤的查询分析语句执行过程。 如&#xff1a;SELECT…

thinkphp文件夹生成zip压缩包

一、准备工作&#xff0c;使用phpinfo()查看有没有zip扩展 <?php echo phpinfo(); ?>Thinkphp使用PHP自带的ZipArchive压缩文件或文件夹 显示enabled 说明已经配置好 如果没有安装扩展的&#xff0c;请参照以下方法&#xff1a; 1、下载对应版本的扩展包&#xff1a…

Java操作excel之poi

1. 创建Excel 1.1 创建新Excel工作簿 引入poi依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ar…

QTableView 和 QAbstractTableModel

1.自定义类继承QAbstractTableModel 头文件如下&#xff1a; #ifndef TESTMOUDLE_H #define TESTMOUDLE_H #include "StructTest.h" #include <QAbstractTableModel> class TestMoudle : public QAbstractTableModel { public: TestMoudle(QStringList&…

如何一次性解压多个文件

第一步&#xff1a;多选压缩包 第二步&#xff1a;右键解压即可 一句话&#xff0c;单个怎么解压&#xff0c;多个就怎么解压&#xff0c;只不过先选中 参考&#xff1a;如何一次性解压多个文件

智能安全帽作业记录仪赋能智慧工地人脸识别劳务实名制

需求背景 建筑工地是一个安全事故多发的场所。目前&#xff0c;工程建设规模不断扩大&#xff0c;工艺流程纷繁复杂&#xff0c;如何完善现场施工现场管理&#xff0c;控制事故发生频率&#xff0c;保障文明施工一直是施工企业、政府管理部门关注的焦点。尤其随着社会的不断进…

YARN,ZOOKEERPER--学习笔记

1&#xff0c;YARN组件 1.1YARN简介 YARN表示分布式资源调度&#xff0c;简单地说&#xff0c;就是&#xff1a;以分布式技术完成资源的合理分配&#xff0c;让MapReduce能高效完成计算任务。 YARN是Hadoop核心组件之一&#xff0c;用于提供分布式资源调度服务。 而在Hadoop …

逻辑漏洞(业务逻辑)dami CMS

逻辑漏洞&#xff08;业务支付逻辑漏洞&#xff09;dami CMS 0x01 业务逻辑简介 业务逻辑指的是一个系统或应用程序中的实际业务规则和流程。它描述了如何处理特定的业务需求、数据和操作。业务逻辑通常是根据特定行业或组织的需求而设计的。 在软件开发中&#xff0c;业务逻…

零编程基础Python的全面学习指南

文章目录 前言什么是编程&#xff1f;Python代码对应的机器码准备开始Windows变量类型整型字符串型布尔类型字符串连接和整数相加if 语句捕获用户输入导入MacWindows游戏时间&#xff01;小结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Pyt…

磐舟CI使用说明及案例

整体介绍 磐舟作为一个devops产品&#xff0c;它具备基础的CI流水线功能。同时磐舟的流水线是完全基于云原生架构设计的&#xff0c;在使用时会有一些注意事项。这里首先我们要了解磐舟整体的流水线打包逻辑。 文档结构说明 一般来说&#xff0c;磐舟推荐单个业务的标准git库…

反编译-ApkTool

ApkTool下载地址&#xff1a; Apktool | ApktoolA tool for reverse engineering Android apk fileshttps://apktool.org/ 1、使用 apktool 解包 执行 java -jar apktool_2.4.1.jar d demo.apk -o demo 命令 java -jar apktool_2.4.1.jar d demo.apk -o demo 其中 d 后面是…

Nevron Vision for .NET 2023.1 Crack

Nevron Vision for .NET 适用于桌面和 Web 应用程序的高级数据可视化 Nevron Vision for .NET提供最全面的组件&#xff0c;用于构建面向 Web 和桌面的企业级数据可视化应用程序。 该套件中的组件具有连贯的 2D 和 3D 数据可视化效果&#xff0c;对观众产生巨大的视觉冲击力。我…

基于window10的远程桌面报错:要求的函数不受支持 的问题解决方法

基于window10的远程桌面报错&#xff1a;要求的函数不受支持 的问题解决方法 设置方法&#xff1a; 一、WINR 在框内输入gpedit.msc 二、依次打开 计算机配置----管理模板-----系统—凭据分配—加密数据库修正–改为以启用—易受攻击 第一步&#xff1a; 第二步&#xff1a;…

并查集总结

并查集简介 并查集是一种可以动态维护若干个不重叠的结合&#xff0c;并支持合并与查询的数据结构 并查集是一种树状的数据结构&#xff0c;可以用于维护传递关系以及联通性。 并查集有两种操作&#xff1a; find&#xff1a;查询一个元素属于哪个集合merge:合并两个集合 模…