面试常见的js算法题


Posted in Javascript onMarch 23, 2017

我们去面试一般都有笔试,笔试题一般都会涉及到很多算法的东西。

不管你用的多不多,反正就是要会。不然笔试很难过。

就算是直接面试的,有时候也会遇到面试官直接叫你当场写个算法题出来这种情况。

因为笔试时间很有限,不会出很复杂的题目,所以笔试怎么出都不会离开下面这几种题。

废话不多说,下面来列出主要的几个算法题。

1.排序

一般都是给个数组然后排序,有的从小到大,有的从大到小。一定要看清楚。以下都是从小到大的排序算法。

冒泡法

var arr = [3,6,1,2,5];
 var temp;
 for(var i= 0;i<arr.length;i++){
 for(var j=i+1;j<arr.length;j++){
 if(arr[i] > arr[j]){
 temp = arr[i];
 arr[i] = arr[j];
 arr[j] = temp;
 }
 }
 }
 console.log(arr);

快速排序法

function quicksort (arr){
 if(arr.length<=1){
 return arr;
 }
 var left = [];
 var right = [];
 var middle = arr[0];
 for(var i=1;i<arr.length;i++){
 if(arr[i]<middle){
 left.push(arr[i]);
 }else{
 right.push(arr[i]);
 }
 }
 return quicksort(left).concat([middle],quicksort(right));
}

注意:可以用快速就不要用冒泡。实在没记住才用冒泡。(因为快速排序设计到递归,面试官更多是想考察你递归算法)

2.数组去重

这题考察的是你会不会存储数组元素的出现次数来解决去重问题。当然解法也有很多,下面是其中一种解法。

Array.prototype.unique = function(){
 var res = [];
 var json = {};
 for(var i = 0; i < this.length; i++){
 if(!json[this[i]]){
 res.push(this[i]);
 json[this[i]] = 1;
 }
 }
 return res;
}
var arr = [112,112,34,'你好',112,112,34,'你好','str','str1'];
alert(arr.unique());

3.js的拷贝

这题涉及到的就是你能不能清楚的分辨深拷贝和浅拷贝。

var a = {name:'Tom'};  var b = a;  b.name = 'Peter'; 

请问a.name = ?

正确答案是Peter,如果你的答案是Tom的话,那么你要好好去看看js的深拷贝。

如果要被拷贝的是数组:

slice和concat都可以直接让数组进行深拷贝

arr.slice();
arr.concat();

下面是解法。当然肯定有比我写得更好的。

function deepCopy(source){
 var result = {};
 for(var i in source){
 if(typeof source[i] === "object"){
 result[i] = deepCopy(source[i]);
 }else{
 result[i] = source[i];
 }
 }
 return result;
}

4.获取字符串里出现子串的位置

function appear(str,str_target){
 var n = 0;
 var result = [];
 while(str.indexOf(str_target,n)!=-1 && n < str.length){
 result.push(str.indexOf(str_target,n));
 n = str.indexOf(str_target,n) + str_target.length;
 }
 return result;
}
var arr = appear('abascbascbabasbascbascascbab','ab');
console.log(arr);

5.不确定数量的数组遍历组合算法

好吧,解释下这题。这题在现实中确实会用到。尤其是做商城网站时,sku的算法真的经常会遇到。

这题的意思就是说。相当于说[1,2,3],[4,5]。。。。的不确定个数的数组进行遍历组合,组成[[1,4],[1,5],[2,4],[2,5],[3,4],[3,5]]这样。然后数组越多,组出来就肯定越多。

那怎么做的,我上网查了一些相关算法都没找到好的,然后我就自己写。可能还是会有点毛病,大家将就看。

有写的更好的欢迎评论教我一下。

function group(arr,re){
 if(arr.length <=0){
 return re;
 }
 if(!re){
 var arr = arr.slice();
 var re = arr.shift();
 return group(arr,re);
 }else{
 var now = arr.shift();
 var newre = [];
 for(var j=0;j<now.length;j++){
 for(var k=0;k<re.length;k++){
 var temp = [];
 if(re[k] instanceof Array){
  temp = re[k];
 }else{
  temp.push(re[k]);
 }
 newre.push(temp.concat(now[j]));
 }
 }
 return group(arr,newre);
 }
}
var arr = [['a','b','c'],['e','d','f'],['h','i'],['j','k','l','m']];
// var arr = [['a','b','c'],['e','d','f'],['h','i']];
// console.log(arr);
var result = group(arr);
console.log(result);

6.lazyMan(这道题考察了很多内容)

这道题自行百度吧。。只要百度lazyMan 面试题,应该是可以搜出来的

7.编写一个函数fn(Number n),将数字转为大写输出,如输入123,输出一百二十三。

好吧,这道题我是忘了我看的本站的哪位的文章了,觉得确实有点意思。

下面是他的代码。

function fn(n){
 if(!/^([1-9]\d*)/.test(n)){
  return '非法数据';
 }
 var unit = '千百十亿千百十万千百十个';
 if(n.length > unit.length){
  return '数据过长';
 }
 var newStr = '';
 var nlength = n.length;
 unit = unit.substr(unit.length - nlength);
 for(var i = 0; i < nlength; i++){
  newStr += '零一二三四五六七八九'.charAt(n[i]) + unit.charAt(i);
 }
 newStr = newStr.substr(0,newStr.length-1);
 newStr = newStr.replace(/零(千|百|十)/g,'零').replace(/(零)+/g,'零').replace(/零(亿|万)/g,'$1');
 return newStr;
}
console.log(fn('205402002103'));

8.如何将浮点数左边的数每三位添加逗号

如1200000.11转成12,000,000.11

result = num && num.toString().replace(/(\d)(?=(\d{3})+\.)/g,function($1,$2){
 return $2 + ',';
})

上面的解法是用正则,当然你也可以用别的方法。

以上就是面试常见题目。可能会有遗漏。欢迎补充。

不要光看。。要自己动手写一下,不然你以为你看会了。其实要你写,你还是写不出。

ok. 就这样。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
Javascript 函数对象的多重身份
Jun 28 Javascript
用js实现in_array的方法
Nov 05 Javascript
利用vue.js插入dom节点的方法
Mar 15 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
Feb 23 Javascript
AngularJS动态添加数据并删除的实例
Feb 27 Javascript
javascript和php使用ajax通信传递JSON的实例
Aug 21 Javascript
使用React手写一个对话框或模态框的方法示例
Apr 25 Javascript
layui use 定义js外部引用函数的方法
Sep 26 Javascript
Vue实例的对象参数options的几个常用选项详解
Nov 08 Javascript
vue组件系列之TagsInput详解
May 14 Javascript
详解JavaScript中的Object.is()与&quot;===&quot;运算符总结
Jun 17 Javascript
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 Vue.js
Vue.Js中的$watch()方法总结
Mar 23 #Javascript
Vue 2.X的状态管理vuex记录详解
Mar 23 #Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
Mar 23 #jQuery
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
Mar 23 #jQuery
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
Mar 23 #jQuery
JS中SetTimeout和SetInterval使用初探
Mar 23 #Javascript
深入学习 JavaScript中的函数调用
Mar 23 #Javascript
You might like
PHP生成Gif图片验证码
2013/10/27 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
你真的了解JavaScript吗?
2007/02/24 Javascript
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
JavaScript执行效率与性能提升方案
2012/12/21 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
bootstrap导航、选项卡实现代码
2016/12/28 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
python梯度下降法的简单示例
2018/08/31 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
通过 Python 和 OpenCV 实现目标数量监控
2020/01/05 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
Python ckeditor富文本编辑器代码实例解析
2020/06/22 Python
python 决策树算法的实现
2020/10/09 Python
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
唤醒头发毛囊的秘密武器:Grow Gorgeous
2016/08/28 全球购物
简单说说tomcat的配置
2013/05/28 面试题
SQL Server里面什么样的视图才能创建索引
2015/04/17 面试题
拉丁舞学习者的自我评价
2013/10/27 职场文书
聚美优品广告词改编
2014/03/14 职场文书
广告创意求职信
2014/03/17 职场文书
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
使用Mysql计算地址的经纬度距离和实时位置信息
2022/04/29 MySQL