JS面试中常见的算法题

2024 前端高频面试题之 JS 篇 ① 所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象② 所有函数都有一个prototype(原型)属性,属性值是一个普通的对象③ 所有引用类型的__proto__属性指向它构造函数的prototype当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__ 阅读详情
1.验证一个数是否是素数

1、如果这个数是 2 或 3,一定是素数;
2、如果是偶数,一定不是素数;
3、如果这个数不能被3至它的平方根中的任一数整除,num必定是素数。而且除数可以每次递增(排除偶数)

function isPrime(num){
    if (num === 2 || num === 3) {
        return true;
    };
    if (num % 2 === 0) {
        return false;
    };
    let divisor = 3,limit = Math.sqrt(num);
    while(limit >= divisor){
        if (num % divisor === 0) {
            return false;
        }
        else {
            divisor += 2;
        }
    }
    return true;
}
console.log(isPrime(30));  // false
2.斐波那契

最简单的做法:递归。

function fibonacci(n){
    if (n <= 0) {
        return 0;
    }
    if (n == 0) {
        return 1;
    }
    return fibonacci(n-1) + fibonacci(n-2);
}

但是递归会有严重的效率问题。比如想要求得f(10),首先需要求f(9)和f(8)。同样,想求f(9),首先需要f(8)和f(7)…这样就有很多重复值,计算量也很大。

改进:从下往上计算,首先根据f(0)和f(1)计算出f(2),再根据f(1)和f(2)计算出f(3)……以此类推就可以计算出第n项。时间复杂度O(n)。

function fibonacci(n){
    let ori = [0,1];
    if (n < 2) {
        return ori[n];
    };
    let fiboOne = 1,fiboTwo = 0,fiboSum = 0;
    for (let i = 2; i <= n; i++) {
        fiboSum = fiboOne + fiboTwo;
        fiboTwo = fiboOne;
        fiboOne = fiboSum;
    }
    return fiboSum;
}
console.log(fibonacci(5));
3、求最大公约数

除数 在a和b的范围内,如果同时a和b处以除数的余等于0,就将此时的除数赋值给res;除数自增,不断循环上面的计算,更新res。

function greatestCommonDivisor(a, b){
    let divisor = 2,res = 1;
    if (a < 2 || b < 2) {
        return 1;
    };
    while(a >= divisor && b >= divisor){
        if (a%divisor === 0 && b%divisor === 0) {
            res = divisor;
        }
        divisor++;
    }
    return res;
};
console.log(greatestCommonDivisor(8, 4)); // 4
console.log(greatestCommonDivisor(69, 169)); // 1

解法2:

function greatestCommonDivisor(a,b){
    if (b === 0) {
        return a;
    } else {
        return greatestCommonDivisor(b,a%b);
    }
};
4、数组去重

对原数组进行遍历
获取arr[i]的值 j;
对应到辅助数组 exits 的位置 j 的值,如果没有,则证明arr[i] 的值没有重复,
此时将 值j 存入res数组,并将辅助数组 j 位置的值置为 true。
最后返回res数组。

function removeDuplicate(arr){
    if (arr === null || arr.length < 2) {
        return arr;
    };
    let res = [],exits = [];
    for(let i = 0; i < arr.length; i++){
        let j = arr[i];
        while( !exits[j] ){
            res.push(arr[i]);
            exits[j] = true;
        }
    }
    return res;
}
console.log(removeDuplicate([1,3,3,3,1,5,6,7,8,1]))  // [1,3,5,6,7,8]
5、删除重复的字符

这一题的解法和上一题类似。

function removeDuplicateChar(str){
    if (!str || str.length < 2 || typeof str != "string") {
        return;
    };
    let charArr = [],res = [];
    for(let i = 0; i < str.length; i++){
        let c = str[i];
        if(charArr[c]){
            charArr[c]++;
        }
        else{
            charArr[c] = 1;
        }
    }
    for(let j in charArr){
        if (charArr[j] === 1) {
            res.push(j);
        }
    }
    return res.join("");
}
console.log(removeDuplicateChar("Learn more javascript dude"));
6、排序两个已经排好序的数组

如果 b数组已经遍历完,a数组还有值 或 a[i] 的值 小于等于 b[i] 的值,则将 a[i] 添加进数组res,并 i++;
如果不是上面的情况,则将 b[i] 添加进数组res,并 i++;

function mergeSortedArr(a,b){
    if (!a || !b) {
        return;
    };
    let aEle = a[0],bEle = b[0],i = 1,j = 1,res = [];
    while(aEle || bEle){
        if ((aEle && !bEle) || aEle <= bEle) {
            res.push(aEle);
            aEle = a[i++];
        }
        else{
            res.push(bEle);
            bEle = b[j++];
        }
    }
    return res;
}
console.log(mergeSortedArr([2,5,6,9], [1,2,3,29]))  // [1,2,2,3,5,6,9,29]
7、字符串反向
function reverse(str){
    let resStr = "";
    for(let i = str.length-1; i >= 0; i--){
        resStr += str[i];
    }
    return resStr;
}
console.log(reverse("ABCDEFG"));
function reverse2(str){
    if (!str || str.length < 2 || typeof str != "string") {
        return str;
    };
    let res = [];
    for(let i = str.length-1; i >= 0; i--){
        res.push(str[i]);
    }
    return res.join("");
}
console.log(reverse2("Hello"));

将函数添加到String.prototype

String.prototype.reverse3 = function(){
    if (!this || this.length < 2) {
        return;
    };
    let res = [];
    for(let i = this.length-1; i >= 0; i--){
        res.push(this[i]);
    }
    return res.join("");
}
console.log("abcdefg".reverse3());
8、字符串原位反转

例如:将“I am the good boy”反转变为 “I ma eht doog yob”。

提示:使用数组和字符串方法。

function reverseInPlace(str){
    return str.split(' ').reverse().join(' ').split('').reverse().join('');
}
console.log(reverseInPlace('I am the good boy'));
9.判断是否是回文
function isPalindrome(str){
    if (!str || str.length < 2) {
        return;
    }
    for(let i = 0; i < str.length/2; i++){
        if (str[i] !== str[str.length-1-i]) {
            return false;
        }
    }
    return true;
}
console.log(isPalindrome("madama"))
10.判断数组中是否有两数之和

eg:在一个未排序的数组中找出是否有任意两数之和等于给定的数。

给出一个数组[6,4,3,2,1,7]和一个数9,判断数组里是否有任意两数之和为9。

这个题解得很巧妙,

1、循环遍历数组,let subStract = num - arr[i];
2、如果 differ[subStract] 里有值,则返回true;如果没有,将 differ[arr[i]] 置为 true。

function sumFind(arr,num){
    if (!arr || arr.length < 2) {
        return;
    };
    let differ = {};
    for(let i = 0; i < arr.length; i++){
        let subStract = num - arr[i];
        if (differ[subStract]) {
            return true;
        }
        else{
            differ[arr[i]] = true;
        }
    }
    return false;
}
console.log(sumFind([6,4,3,2,1,7], 9));  // true
11.连字符转成驼峰

如:get-element-by-id 转为 getElementById

let str = 'get-element-by-id';
let arr = str.split('-');
for(let i=1; i<arr.length; i++){
  arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].substring(1);
}
console.log(arr.join(''));   // getElementById
12.加油站问题-贪心算法

一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。对于给定的n(n <= 5000)和k(k <= 1000)个加油站位置,编程计算最少加油次数。并证明算法能产生一个最优解。
要求:

输入:第一行有2个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1 行中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第k+1 个加油站表示目的地。

输出:输出编程计算出的最少加油次数。如果无法到达目的地,则输出”NoSolution”。

function greedy(n, k, arr){  // n:加满可以行驶的公里数; k:加油站数量; arr:每个加油站之间的距离数组
    if (n == 0 || k == 0 || arr.length == 0 || arr[0] > n) {
        return "No Solution!";  // arr[0] > n :如果第一个加油站距离太远,也无法到达
    };
    let res = 0, distance = 0;  // res:加油次数;distance:已行驶距离
    for(let i = 0; i <= k; i++){
        distance += arr[i];
        if (distance > n) {  // 已行驶距离 > 加满可以行驶的公里数
            if(arr[i] > n){  // 如果目前加油站和前一个加油站的距离 > 加满可以行驶的公里数,则无法到达
                return "No Solution!";
            };
            // 可以在上一个加油站加油,行驶到目前的加油站i:
            distance = arr[i];
            res++;  // 加油次数+1
        }
    }
    return res;
}
let arr = [1,2,3,4,5,1,6,6];
console.log(greedy(7,7,arr))  // 4
13.用正则实现trim() 清除字符串两端空格
String.prototype.trim1 = function(){
    // return this.replace(/\s*/g,"");  // 清除所有空格
    return this.replace(/(^\s*)|(\s*$)/g,"");  // 清除字符串前后的空格
};
console.log("  hello word ".trim1())  // "hello word"
14.将数字12345678转化成RMB形式:12,345,678

思路:将字符串切割成数组再反转,遍历数组,加入辅助数组,当数组长度为3的倍数,再向辅助数组加入 “,”。

function RMB(str){
    let arr = str.split("").reverse();
    let res = [];
    for(let i = 0; i < arr.length; i++){
        res.push(arr[i]);
        if ((i + 1) % 3 === 0) {
            res.push(",");
        }
    }
    return res.reverse().join("");
}
console.log(RMB("12345678"))
15.删除相邻相同的字符串
function delSrt(str){
    let res = [], nowStr;
    for(let i = 0; i < str.length; i ++){
        if (str.charAt(i) != nowStr) {
            res.push(str.charAt(i));
            nowStr = str.charAt(i);
        }
    }
    return res.join("");
}
console.log(delSrt("aabcc11"))
深入浅出JavaScript进阶【Day1】常见的经典面试算法题 有人说过:2023年以后的中国市场将永远属于长期主义者,bug是改不完的,只能说这次遇到了希望下次不会在出现同样的bug就行,如果你觉得对您有帮助,欢迎一起交流学习,本人也是一名很菜的20级学生,编程界的小白,一起加油变优秀啦!values() 方法是 Set 对象的一个内置方法,它返回一个新的迭代器对象,该迭代器按照集合中元素被插入的顺序,依次迭代返回集合中的每个元素的值。使用 fill() 方法,可以快速填充数组中的元素,可以用来初始化数组、重置数组的值或者替换数组中的部分元素。 阅读详情

相关推荐

自己总结的二十四道js算法题

js所有的算法,自己总结的,如有遗漏,请留言。希望可以帮助到需要的人

前端js 常见算法面试题目详解

本文介绍了三种常见算法题及其解法: 哈希表法:通过哈希函数快速查找补数,解决两数之和问题,时间复杂度O(n)。 字母异位词分组:利用排序后的字符串作为键,分组存储异位词,最后返回分组结果。 双指针法:包括对撞指针和快慢指针,用于移动零、盛水容器等问题,优化时间与空间复杂度。 最长连续序列:先排序数组,再遍历统计最长连续序列长度,时间复杂度O(n)。 这些方法展示了如何通过哈希表、双指针等技巧高效解决数组与字符串问题。

qq_38980678的博客 1091

qmc5883p芯片坐标系方向定义

问题 最近一个项目用到qmc5883p, 然而确定磁力计方向的时候发现datasheet上写的不是很清楚, 并且example中还有一个设置方向的一步, 于是测试了芯片坐标方向并记录了下来; 该芯片和qmc5883L方向并不一致; 结果 qmc5883P的datasheet给出来如下说明, Y为笔者添加的; 但是这个方向是按照datasheet的example设置的结果: //Define the sign for X Y and Z axis qmc5883p_write_reg(0x2

时有限 4115

JavaScript算法题100道

JavaScript算法题100道

subsistent的博客 5401

实战指南:在UE5中高效集成Entt(ECS)框架

本文提供了一份在虚幻引擎5中高效集成Entt ECS框架的实战指南。针对UE5项目在处理大规模动态实体时的性能瓶颈,详细讲解了如何通过数据驱动的ECS架构进行优化。内容包括前期环境准备、核心构建步骤、创建首个ECS子系统以及与UE原生系统的数据同步技巧,旨在帮助开发者快速掌握集成方法,提升游戏逻辑的执行效率。

weixin_29002209的博客 158

论文阅读:Visual Relationship Detection with Language Priors

Visual Relationship Detection with Language Priors(ECCV2016) 文章   尽管大多数的relationship并不常见,但是它们的object和predicate却更频繁地独立出现。paper用这个insight分别独立训练训练object和predicate的模型,然后再进行组合来预测relationship。Visual relatio...

Kivee的博客 2877

10个js算法题目(详细注释+源码)

10个js算法题目(详细注释+源码) 1、冒泡排序调优(从小到大排序) 2、输出九九乘法表 3、输出水仙花数 4、1–10的阶乘和 5、输出1900年至2100年中的所有闰年 6、输出10–100之间的所有素数 7、1,2,3,4四个数字,能组合成多少种互不相同且没有重复的三位数 8、取出四位数中的各个位上的数字 9、猴子吃桃问题 10、用星号输出菱形 Google Chrome Console运...

袁成新(Chauncey Yuan) 2170

C++开发基础之掌握常用的三种异步编程模型

以上是三种常见的C++异步编程模型,每种模型都有其适用的场景和特点。根据具体需求,你可以选择合适的模型来进行异步编程。

dotnet研习社 2175

web前端开发面试中常见的算法题(JS)

前言 最近在准备秋招,做过了大大小小的公司的面试题,发现除了基础知识外,算法还是挺重要的。特意整理了一些常见的算法题,添加了自己的理解并实现。 除此之外,建议大家还可以刷刷《剑指offer》(但我还没刷完?,任重道远呐)。此外,左神在牛客网上也有算法课程,听了基础班的感觉还不错,起码让我这个算法小白也能快速地理解了很多问题,知识付费的时代,这个真的是良心课程了。就我个人而言的话,平时为了解决一...

weixin_40141473的博客 2万+

核回归(Kernel Regression)

本文讲解了核函数,并且实战通过核函数进行了预测,并附python代码

a2333333_的博客 6955

GPT Researcher 的win docker安装攻略

github网址是:https://github.com/assafelovic/gpt-researcher/blob/master/README-zh_CN.md。使用 Docker 运行 AI-Researcher 项目的。因为docker安装方法不够清晰,因此写一个使用方法。打开设置——docker engine ,增加代码。如有其他问题,可提供错误截图或日志进一步排查!

weixin_43818488的博客 1123

JS面试常见算法题

学习数据结构与算法对于工程师去理解和分析问题都是有帮助的。如果将来当我们面对较为复杂的问题,这些基础知识的积累可以帮助我们更好的优化解决思路。下面罗列在前端面试中经常撞见的几个问题吧。 1.统计一个字符串出现最多的字母和出现的次数 第一种方法:var str = 'abcdeddd' var n = {} for(var i = 0; i < str.length; i++) { var c

youjinli122的博客 5195

vue2 - elementUI表格table树形结构复选框勾选父子联动示例,el-table树状表格tree复选框checkbox多选框全选/反选取消children(当子级全选中,父级自动勾选)

vue2,elementui,el-table树状表格多选,树形结构结合多选框使用,实现单选父子联动全选反选,勾选联动父级勾选,表格多选check父子联动,table表格children如何嵌入复选框,el-table使用多选框与树形数据写一个有半选全选功能的表格,el-table树形表格实现复选框多选效果,表格树状结构多选,每一个row都可以选中并且联动全选按钮,table选父带子选子带父,树形数据与懒加载,Table表格树形结构多选框选中父级时会选中子级,elementUI表格里树形结构嵌套复选框全选全

✅ 精选推荐文章 1万+

常见的JavaScript面试简单算法题

应聘前端实习面试中遇到的一些简单的JS算法题,虽然比较简单,但还是记录一下吧

weixin_44171308的博客 451

英飞凌TC3xx之一起认识GTM(八)如何使用DTM实现死区时间配置

本文简要介绍英飞凌TC3xx系列芯片的DTM模块结构,以及有哪些相关寄存器可用于实现相关配置。

无所适从的我的博客 4648

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

js常见面试基础笔试算法题

1、大数相加计算 function addNum(a, b){ let maxLen = Math.max(a.length, b.length); // 取最长 a = a.padStart(maxLen, 0); // 开头补全 b = b.padStart(maxLen, 0); // 开头补全 let sum = ""; let f = 0; // 进位1 for(let i = maxLen - 1; i >= 0;

weixin_40918145的博客 1037

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

分享:JS面试中常见的算法题

作者Allison-Lhttps://blog.youkuaiyun.com/weixin_40141473/article/details/102304056js除了基础知识以外...

zz_jesse的博客 641

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JS常见笔试面试算法题

3.将重叠的区间进行合并去重操作。2.判断一个区间是否有重叠。1.数组扁平化去重并排序。

small red red的博客 583

web前端开发必知必会:面试中常见的算法题(JS)

web前端开发必知必会:面试中常见的算法题(JS)

南北极之间 784

JavaScript中的算法(附10道面试常见算法题解决方法和思路)

https://juejin.im/post/6844903811505455118Introduction面试过程通常从最初的电话面试开始,然后是现场面试,检查编程技能和文化契合度。几...

前端开发博客 2326

android面试刷题,那些年Android面试官常问的知识点

背景 首先我是个菜鸡,工资也低的一笔。 刚毕业时候在一家国企上班干 app 开发,干了快两年的时候,跳槽到了一家伪大厂干安全。投了不少简历都没有回音,只有这加伪大厂要我就来了。当时说好了会接触一些底层的东西,然而平时也就写 python 脚本,逆向,android 上写了一些风控的东西,感觉有点 low,工资也不高,当初没敢多要,hr 给的比我要的还高。刚刚 leader 谈了谈明年的规划,现在想跳槽。 现在也是很尴尬,原来 app 开发的东西也忘了不少,然后其实我想干 framework 开发,自己对 a

m0_68629662的博客 1789

2020年11月-北京-今日头条面试题

一面 常见的请求头,响应头 http与https区别,https是怎样加密的 常见状态码,做什么用的 vue的原理大致说下(我从响应式,虚拟dom,模版编译三个方面来回答的) vue首次渲染是在什么时候 vue.$set原理 vue中的key vue常见优化 webpack的常见优化 讲一下对闭包的理解 算法题,合并两个升序数组 宏任务,微任务问题 const pro = new Promise((resolve, reject) => { const innerpro = new Pro

Baron的技术blog 493

2024年阿里Android高级面试题及答案,Android外包是如何进入阿里的

一份漂亮的简历,需要包括以下部分(排版由上而下)个人亮点(专精领域,个人博客,开源项目)教育经历(毕业院校,在校经历、荣誉)工作经历(实习)项目经历专业技能扎实的前端基础,比如你知道作用是什么?flex:1的 1 代表什么?Generator如何抛出错误?熟悉一门前端框架(React 优先)勤刷 LeetCode 的算法题,熟悉掌握相应的数据结构如常见的链表、栈、队列、哈希表、树熟悉网络基础、Git 命令、Linux 命令。

2401_84899542的博客 1025

长文预警,凭借2024最新前端面试题精选大全 ,成功混圈阿里字节腾讯_群接龙前端面试

阿里十分注重你对源码的理解,对你所学,所用东西的理解,对项目的理解。开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】框架原理真的深入某一部分具体的代码和实现方式时,要多注意到细节,不要只能写出一个框架。算法方面很薄弱的,最好多刷一刷,不然影响你的工资和成功率😯在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。

2401_84433924的博客 380
下一篇: JavaScript运算符和流程控制
龟中的程序员
博客等级 码龄7年 328粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龟中的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值