面试常见的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 相关文章推荐
利用JS来控制键盘的上下左右键(示例代码)
Dec 14 Javascript
JS获取select-option-text_value的方法
Dec 26 Javascript
jquery预览图片实现鼠标放上去显示实际大小
Jan 16 Javascript
基于jQuery实现的菜单切换效果
Oct 16 Javascript
举例讲解JavaScript substring()的使用方法
Nov 09 Javascript
js纯数字逐一停止显示效果的实现代码
Mar 16 Javascript
解决jquery无法找到其他父级子集问题的方法
May 10 Javascript
用angular实现多选按钮的全选与反选实例代码
May 23 Javascript
node.js文件上传重命名以及移动位置的示例代码
Jan 19 Javascript
JavaScript实现数字前补“0”的五种方法示例
Jan 03 Javascript
jquery无缝图片轮播组件封装
Nov 25 jQuery
Vue axios与Go Frame后端框架的Options请求跨域问题详解
Mar 03 Javascript
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伪静态页面函数附使用方法
2008/06/20 PHP
php下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
javascript demo 基本技巧
2009/12/18 Javascript
jquery-easyui关闭tab自动切换到前一个tab
2010/07/29 Javascript
jQuery截取指定长度字符串代码
2014/08/21 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
JavaScript弹出新窗口并控制窗口移动到指定位置的方法
2015/04/06 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
Vue实现用户自定义字段显示数据的方法
2018/08/28 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
vue项目打包后怎样优雅的解决跨域
2019/05/26 Javascript
Vue实现手机计算器
2020/08/17 Javascript
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python uuid模块使用实例
2015/04/08 Python
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
使用CodeMirror实现Python3在线编辑器的示例代码
2019/01/14 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
Python 实现自动导入缺失的库
2019/10/29 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
2021/02/23 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
美国奢侈品在线团购网站:Gilt City
2017/11/16 全球购物
德国骆驼商店:ActiveFashionWorld
2017/11/18 全球购物
致跳远、跳高运动员广播稿
2014/01/09 职场文书
导游个人求职信范文
2014/03/23 职场文书
2014年冬季防火方案
2014/05/21 职场文书
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript
CSS 鼠标选中文字后改变背景色的实现代码
2023/05/21 HTML / CSS