前端面试经典算法题

前言

现在面试流行考核算法,做过面试官,也被面试。问算法对面试官来说,是一种解脱,找出了一个看似很高明且能偷懒的办法选择人,避免了不知道问啥的尴尬;被面试者,也找到了一种新的面试八股文,刷就对了;算法题让面试与被面试找到了一种平衡。

在实际的开发中,很多被考核的算法确实没啥卵用,面试者要认真琢磨考什么?下面是作者本人经历的一些面试题,有字节、腾讯、百度、滴滴的,仅供参考。

字符串插值

考察正则表达式、数组、字符串操作

// 字符串插值;
const data1 = {asd: {ddd: ["bbb"],},
};
const data2 = {ccc: 666,
};
const template = (str, data) => {// 正则匹配// ${data.asd.ddd.0}const reg = /${(.+[^}])}/g;const tempStr = str.match(reg)[0].replace("${data.", "").replace("}", "");console.log(tempStr);let arr = tempStr.split(".");// 第0个赋值let resTemp = data[arr[0]];// 遍历查询for (let i = 1; i < arr.length; i++) {if (resTemp[arr[i]]) {resTemp = resTemp[arr[i]];} else {resTemp = undefined;}}let res = resTemp;// 数组转换if (res !== undefined) {res = Array.from(new Set(resTemp.split(""))).join("");}return str.replace(reg, res);
};console.log(template("pre_${data.asd.ddd.0}_tail", data1));// pre_b_tail;// console.log(template("pre_${data.ccc}_tail", data2));// pre_666_tail;

将一组区间中所有重叠的区间进行合并

例如 // 输入:[[1,3],[2,6],[10,15],[9,11],[1,3]] // 输出:[ [ 1, 6 ], [ 9, 15 ] ]

不知道考核什么,可能是考核逻辑(需要脑子清醒的时候面~)

function mergeArr(arr) {//   arr = Array.from(new Set(arr));//   console.log(arr);//   arr = ar.map((item) => {});const res = [arr[0]];for (let i = 1; i < arr.length; i++) {const ele1 = arr[i];let count = 0;for (let j = 0; j < res.length; j++) {const ele2 = res[j];if (ele1[0] >= ele2[0] && ele1[0] <= ele2[1] && ele1[1] >= ele2[1]) {ele2[1] = ele1[1];} else if (ele1[1] >= ele2[0] &&ele1[1] <= ele2[1] &&ele1[0] <= ele2[0]) {ele2[0] = ele1[0];} else {count++;}}if (count === res.length) {res.push(ele1);}}console.log(res);return res;
}mergeArr([[1, 3],[2, 6],[10, 15],[9, 11],[1, 3],
]);

b中存在多少个a中的字符串

考核的是Map用法

// a生成has map,查询b的字符串是否存在map中
function str(a, b) {const map = new Map();let res = 0;// a转为mapfor (let i = 0; i < a.length; i++) {map.set(a[i], 0);}// 对b进行遍历,查看map中是否存在b[j]for (let j = 0; j < b.length; j++) {if (map.has(b[j])) {res++;// map.set(b[j], map.get(b[j] + 1));}}return res;
}const J = "aA";
const S = "aAAbbbbb";console.log(str(J, S));

考察十进制转二进制

/**************** 题目***********/
// 输⼊: 5
// 输出: 2
// 解释: 5 的⼆进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。// 输⼊: 1
// 输出: 0
// 解释: 1 的⼆进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。
/**************** 题目***********/// 字符串使用索引只能读不能改
// replace方法只能不修改字符串本身
// 二进制 十进制转换function fn(n) {let str = parseInt(n).toString(2);if (str[0] === "1") {str = "0" + str.slice(0, str.length - 1);} else {str = "1" + str.slice(0, str.length - 1);}return parseInt(str, 2);
}
console.log(fn(5));// 有符号右位移;
function fn2(n) {return n >> 1;
}
console.log(fn2(5));

首个不重复字符索引

// 首个不重复字符串索引
function fn(str) {const map = new Map();for (let i = 0; i < str.length; i++) {if (map.has(str[i])) {map.set(str[i], 1);} else {map.set(str[i], 0);}}for (let i = 0; i < str.length; i++) {if (map.get(str[i]) === 0) {return i;}}return -1;
}console.log(fn("loveleetcode"));

数组排序

function fn(arr1, arr2) {let temp = 0;let res = arr2;while (arr1.length) {const num = arr1.shift();for (let i = temp; i < arr2.length; i++) {if (num <= arr2[i]) {// res = [num].concat(res);res.splice(i, 0, arr2[i]);temp = i;break;}}}console.log(res);return res;
}fn([1, 3, 4], [1, 2, 3, 4, 5]);

数组中两个数的和

// 数组加和
function fn(arr, target) {const len = arr.len;const res = [];const map = new Map();arr.forEach((item) => {const temp = target - item;if (map.has(temp)) {res.push([item, map.get(temp)]);}map.set(item, item);});console.log(res);return res;
}const arr = [15, 2, 7, 3, 11, 1];
const target = 18;
fn(arr, target);// 输出[(3, 15)][(7, 11)];

n 个有序数组,求第m大的数

// n 个有序数组,求第m大的数
function fn(arr, m) {// 数组合并for (let i = 0; i < arr.length - 1; i++) {const arr1 = arr[i];const arr2 = arr[i + 1];while (arr1.length) {const n = arr1.shift();for (let j = 0; j < arr2.length; j++) {if (n <= arr2[j]) {arr2.splice(j, 0, n);break;}}}}console.log(arr[arr.length - 1], arr[arr.length - 1][m - 1]);return arr[arr.length - 1][m - 1];
}fn([[1, 2, 3],[2, 3, 5],],3
);

无序数组。有正有负,求和最大的子数组

// 无序数组。有正有负,求和最大的子数组function fn(arr) {// 子数组const len = arr.length;arr = arr.map((item) => {if (item >= 0) return item;});console.log(arr);const subArr = [];const backtrack = (path, l) => {if (path.length === l) {subArr.push(path);return;}for (let i = 0; i < len; i++) {if (path.includes(arr[i])) continue;backtrack(path.concat([arr[i]]), l);}};for (let i = 1; i <= len; i++) {backtrack([], i);}subArr.sort((a, b) => {// console.log(a);const aSum = a.reduce((p, n) => p + n);const bSum = b.reduce((p, n) => p + n);return bSum - aSum;});console.log(subArr[0]);return subArr[0];//     for (let n = 0; n < subArr.length; n++) {//         const mid = Math.floor(subArr.length / 2)//   }// 和比较
}fn([1, 2, -3]);

闭包&函数的toString方法

// add(1)(2)(3) 6
// add(1)(2)(3)(4) 10function add() {// 保存变量let arg = [].slice.call(arguments);// 加和计算function _adder() {const _arg = [].slice.call(arguments);arg.push(..._arg);console.log(_arg);_adder.toString = function() {const res = arg.reduce((previous, current) => {return previous + current;});return res;};return _adder;}return _adder;
}const a = add(1, 2)(3);
console.log(a + 1);

字符串的随机组合

// 字符串的随机组合// 回溯算法function randomStr(str) {const res = [];const backtrack = (path) => {if (path.length === str.length) {res.push(path);return;}for (let i = 0; i < str.length; i++) {if (path.includes(str[i])) continue;backtrack(path + str[i]);}};backtrack("", 0);console.log(res);return res;
}randomStr("abc");

平衡二叉树

// 平衡二叉树function isBalanced(root) {if (!root) return true;const rec = (root) => {if (!root) return true;const left = root.left;const right = root.right;const leftValue = rec(left);const rightValue = rec(right);if (leftValue.left === null &&leftValue.right === null &&(rightValue.right.right || rightValue.right.left)) {return false;}if (rightValue.left === null &&rightValue.right === null &&(rightValue.right.right || rightValue.right.left)) {return false;}};rec(root);
}console.log(isBalanced(bt));

大数阶乘算法

因为数大,js是存不下的,因此就把计算结果拆解存数组里面,原理就是把计算的各个位的值存起来。

function fn(n){let a = [1]for(let i = 1; i <= n; i++) {// res*=ifor(let j = 0, c = 0; j < a.length || c != 0; j++){const m = (j < a.length) ? (i * a[j] + c) : ca[j] = m % 10c = (m - a[j])/10}}return a.reverse().join('')
}
console.log(fn(1005));

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

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

相关文章

机器学习笔记

文章目录 编码器-解码器Batch Normalization好处 编码器-解码器 第二个input与transformer中的解码器类似。 Batch Normalization 尽量使得w1和w2之间呈现为正圆 训练模型的时候&#xff0c; μ \mu μ和 σ \sigma σ不可以认为是常数&#xff0c;而是包含数据的变量&…

finereport中自定义图表提示

点击后把该分类下所有的系列都展示 function(){ var points this.points; var value "" this.category; for(var i 0;i < points.length;i) { if(points[i].series.visible){ value "●&qu…

【K8S】pod 基础概念讲解

目录 Pod基础概念&#xff1a;在Kubrenetes集群中Pod有如下两种使用方式&#xff1a;pause容器使得Pod中的所有容器可以共享两种资源&#xff1a;网络和存储。总结&#xff1a;kubernetes中的pause容器主要为每个容器提供以下功能&#xff1a;Kubernetes设计这样的Pod概念和特殊…

部署SpringBoot项目在服务器上,并通过swagger登录

1.项目编译打包 2.上传jar包到服务器并启动 xftp将打包好后的jar包传到虚拟机指定路径 java -jar执行该jar包 3.通过swagger登录 输入后点击下面的执行按钮 会得到一个tocken 4.将tocken放到postman的Headers中 5.修改url 例如我本地测试是http://localhost:8080/接口名&am…

Vue命名规范

JS文件命名 一般采用的是小驼峰命名法&#xff0c;如 pieChartHelp 第一个单词小写&#xff0c;其他单词首字母大写 Components 文件命名 一般采用的是大驼峰命名法&#xff0c;如PieChart 所有单词的首字母大写 常量命名 一般全部大写&#xff0c;每个单词使用分隔符隔开&…

一文读懂|RDMA原理

什么是DMA DMA全称为Direct Memory Access&#xff0c;即直接内存访问。意思是外设对内存的读写过程可以不用CPU参与而直接进行。我们先来看一下没有DMA的时候&#xff1a; 无DMA控制器时I/O设备和内存间的数据路径 假设I/O设备为一个普通网卡&#xff0c;为了从内存拿到需要…

【有关数据库的编码格式和导出备份】

问题1&#xff1a;前端页面可以正常插入数据到数据库mysql中&#xff0c;但是却显示不了数据库中的数据内容&#xff1f; 分析&#xff1a;通过尝试&#xff0c;当数据插入的全部都是英文时&#xff0c;可以正常显示数据&#xff0c;但是出现中文时&#xff0c;则连带着全部数…

【MySQL】MySQL数据类型

文章目录 一、数据类型的分类二、tinyint类型2.1 创建有符号数值2.2 创建无符号数值 三、bit类型三、浮点类型3.1 float3.2 decimal类型 四、字符串类型4.1 char类型4.2 varchar类型 五、日期和时间类型六、枚举和集合类型6.1 enum的枚举值和set的位图结构6.2 查询集合find_in_…

JavaScript--AJAX

概述 传统的web交互是用户触发一个http请求服务器&#xff0c;然后服务器收到之后&#xff0c;在做出响应到用户&#xff0c;并且返回一个新的页面&#xff0c;每当服务器处理客户端提交的请求时&#xff0c;客户都只能空闲等待&#xff0c;并且哪怕只是一次很小的交互、只需从…

Python爬虫如何更换ip防封

作为一名长期扎根在爬虫行业动态ip解决方案的技术员&#xff0c;我发现很多人常常在使用Python爬虫时遇到一个困扰&#xff0c;那就是如何更换IP地址。别担心&#xff0c;今天我就来教你如何在Python爬虫中更换IP&#xff0c;让你的爬虫不再受到IP封锁的困扰。废话不多说&#…

计算机视觉与图形学-神经渲染专题-pi-GAN and CIPS-3D

《pi-GAN: Periodic Implicit Generative Adversarial Networks for 3D-Aware Image Synthesis》 摘要 我们见证了3D感知图像合成的快速进展&#xff0c;利用了生成视觉模型和神经渲染的最新进展。然而&#xff0c;现有的方法在两方面存在不足&#xff1a;首先&#xff0c;它们…

kafka:java client使用总结塈seek() VS commitSync()的区别(三)

最近一段日子接触了kafka这个消息系统&#xff0c;主要为了我的开源中间件项目simplemq增加kafka支持&#xff08;基于kafka-client【java】&#xff09;&#xff0c;如今总算完成&#xff0c;本文是对这个过程中对kafka消息系统的使用总结 线程安全 关于线程安全&#xff0c…

QT 使用单例模式

目录 1. 单例模式介绍 2.单例模式实现 1. 单例模式介绍 有些时候我们在做 qt 项目的时候,要用到很多类. 例如我们用到的类有 A,B,C,D. 其中,A 是 B,C,D 中都需要用到的类,A 类非常的抢手. 但是,A 类非常的占内存,定义一个 A 对象需要 500M 内存,假如在 B,C,D 中都定义一个 A 类…

面试之快速学习C++11- constexpr以及constexpr和const区别

学习地址&#xff1a; http://c.biancheng.net/view/3730.html 10.constexpr&#xff1a;验证是否为常量表达式 常量表达式&#xff1a; 指的就是由多个&#xff08;≥1&#xff09;常量组成的表达式&#xff0c;换句话说&#xff0c;如果表达式中的成员都是常量&#xff0c;…

模型训练之train.py代码解析

题目 作者:安静到无声 个人主页 from __future__ import absolute_import from __future__ import division from __future__ import print_function这段代码使用了Python 2.x的__future__模块来导入Python 3.x的一些特性。在Python 2.x中,使用print语句来输出内容,而在Py…

精准定位:私域流量运营方法解析

随着市场竞争的不断加剧&#xff0c;企业越来越意识到私域流量运营的重要性。与传统的广告推广相比&#xff0c;私域流量运营可以更加精准地定位目标用户&#xff0c;提高用户参与度和忠诚度&#xff0c;从而实现更高的转化率和销售增长。在本文中&#xff0c;我们将深入探讨私…

Modbus TCP转Profibus DP网关modbus tcp报文解析

捷米JM-DPM-TCP网关。在Profibus总线侧作为主站&#xff0c;在以太网侧作为ModbusTcp服务器功能&#xff0c; 下面是介绍捷米JM-DPM-TCP主站网关组态工具的配置方法 2, Profibus主站组态工具安装 执行资料光盘中的安装文件setup64.exe或setup.exe安装组态工具。安装过程中一直…

vscode 设置滑条颜色

1. 默认的滑条是灰黑色的&#xff0c;很难看的清 2. 左下角&#xff0c;打开VS Code 设置功能 3. 输入命令 workbench color&#xff0c;回车 4. 找到工作台&#xff1a;自定义颜色设置&#xff0c;打开设置文件 setting.json 5. 打开配置文件 6. 添加颜色配置 "workben…

C 语言的 getchar() 函数和 putchar() 函数

getchar() 函数和 putchar() 函数是一对字符输入和输出函数. getchar() 作用&#xff1a;get a character from stdin 原型&#xff1a;int getchar( void ); Required Header&#xff1a;<stdio.h> Compatibility&#xff1a;ANSI Return value&#xff1a;return…

暑假刷题第23天--8/7

D-游游的k-好数组_牛客周赛 Round 6 (nowcoder.com)&#xff08;关键--a[1]a[k1]&#xff09; #include<iostream> #include<algorithm> using namespace std; const int N100005; int a[N]; typedef pair<int,int>PII; PII b[N]; void solve(){int n,k,x;…