js除了基础知识以外,算法也是挺重要的。因此特意整理了一些常见的算法题,希望大家有帮助。

1.验证一个数是否是素数

1、如果这个数是 2 或 3,一定是素数;

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、数组去重

对原数组进行遍历

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"));
// Lnmojvsciptu

6、排序两个已经排好序的数组

如果 b数组已经遍历完,a数组还有值 或 a[i] 的值 小于等于 b[i] 的值,则将 a[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];

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"))

本文链接:

https://blog.csdn.net/weixin_40141473/article/details/102304056

JS面试中常见的算法题相关推荐

  1. 校招面试中常见的算法题整理【长文】

    ⭐️我叫恒心,一名喜欢书写博客的研究生在读生. 原创不易~转载麻烦注明出处,并告知作者,谢谢!!! 这是一篇近期会不断更新的博客欧~~~ 有什么问题的小伙伴 欢迎留言提问欧. 文章目录 前言 一.链表 ...

  2. 前端面试中常见的算法问题

    虽说我们很多时候前端很少有机会接触到算法.大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面.实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的.如果将来当我们面对较为复杂 ...

  3. 六道面试中常见的智力题 来看看你会做几道?

    下面的题目来自滴滴出行2017秋招题.这些题目是我自己觉得比较难或者比较容易出错的题目. 下面就是题目了,开始头脑风暴吧~~~ 问题 question one 桌上有12个黑球和1个白球围成一个圆,按 ...

  4. 数据结构 - 二叉树 - 面试中常见的二叉树算法题

    数据结构 - 二叉树 - 面试中常见的二叉树算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图 ...

  5. 数据结构 - 链表 - 面试中常见的链表算法题

    数据结构 - 链表 - 面试中常见的链表算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图. ...

  6. JavaScript 面试中常见算法问题详解

    JavaScript 面试中常见算法问题详解,翻译自 https://github.com/kennymkchan/interview-questions-in-javascript.下文提到的很多问 ...

  7. c++ 查找 list中最长的字符串_查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答)...

    查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答) 给定一个字符串str,找到不重复字符的最长子字符串. 比如我们有 "ABDEFGABEF", 最长的字符串是 ...

  8. 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 字符串处理+动态规划 合集!

    Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...

  9. 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 链表 + 栈 + 队列 部分!

    链表 链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,也适合考察写代码的能力.链表的操作也离不开指针,指针又很容易导致出错. 综合多方面的原因,链 ...

最新文章

  1. 0414复利计算6.0--结对
  2. linux c http下载 带确认 进度条
  3. DCT C语言 修改了c程序以及matlab的程序
  4. inner join on, left join on, right join on的区别与介绍
  5. 媒体查询media的3种引入方式
  6. 例4:写一个把字符串的所有大写字母改为小写的程序。设字符串以0结尾。
  7. r语言将百分数化为小数_C语言入门学习(一)
  8. [转载]Asp.net MVC中Controller返回值类型
  9. centos 默认php 版本太低移到高版本的办法
  10. 13篇京东CVPR 2019论文!你值得一读~
  11. Hbase与pegasus对比
  12. Hadoop集群安装配置教程_Hadoop2.6.0_UbuntuCentOS(林子雨教授,超级详细)
  13. 计算机中英文打字文章,中英文打字练习文章优美范文
  14. 神策数据盛永根:微信生态——全数据采集和打通
  15. 张一鸣:所谓逆袭,不过是30年如一日的拼命努力!
  16. JSPatch转换器:可直接将OC代码转换成JS代码
  17. 回望2016-2018,希望在2019年有所斩获!
  18. java 数据库连接池链接数据库
  19. RK3399平台开发系列讲解(SPI子系统)4.36、SPI子系统驱动框架详解
  20. 龍行天下 GHOST XP SP3 VIP会员特供版

热门文章

  1. 经典算法(动态图展示)
  2. 浅析配音的类别以及不同
  3. 浙江大学计算机专业夏令营,浙江大学计算机科学与技术学院数字化艺术与设计保研夏令营...
  4. 1102: 火车票退票费计算(函数专题)C语言
  5. 在word上写博客直接发到CSDN ——失败哈哈
  6. 【51nod P3121】小陶与杠铃片【树状数组】
  7. 独立版:零点城市社交电商V2.1.9.8 新增多宝鱼第三方商品插件
  8. 找合适的PMP机构只需2步搞定,一查二问
  9. mysql的redo与undo
  10. Unreal中Interface接口的使用