面试常见的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 相关文章推荐
读jQuery之十二 删除事件核心方法
Jul 31 Javascript
javascript学习基础笔记之DOM对象操作
Nov 03 Javascript
Jquery实现遮罩层的方法
Jun 08 Javascript
jquery实现的用户注册表单提示操作效果代码分享
Aug 28 Javascript
深入理解JS addLoadEvent函数
May 20 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
Nov 23 Javascript
jquery+css实现侧边导航栏效果
Jun 12 jQuery
JavaScript实现三级联动菜单实例代码
Jun 26 Javascript
Cpage.js给组件绑定事件的实现代码
Aug 31 Javascript
JS实现根据数组对象的某一属性排序操作示例
Jan 14 Javascript
微信小程序webview实现长按点击识别二维码功能示例
Jan 24 Javascript
分享15个Webpack实用的插件!!!
Mar 31 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
用缓存实现静态页面的测试
2006/12/06 PHP
php调用dll的实例操作动画与代码分享
2012/08/14 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
推荐:极酷右键菜单
2006/11/29 Javascript
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
5款Javascript颜色选择器
2009/10/25 Javascript
jquery中邮箱地址 URL网站地址正则验证实例代码
2013/09/15 Javascript
js实现仿Discuz文本框弹出层效果
2015/08/13 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
React快速入门教程
2017/01/17 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python类参数self使用示例
2014/02/17 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
Python实现递归遍历文件夹并删除文件
2016/04/18 Python
python3爬取各类天气信息
2018/02/24 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
基于python实现名片管理系统
2018/11/30 Python
如何获取Python简单for循环索引
2019/11/21 Python
Pycharm最新激活码2019(推荐)
2019/12/31 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
Matplotlib配色之Colormap详解
2021/01/05 Python
素质拓展感言
2014/01/29 职场文书
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电