面试题中遇到的算法与js技巧
近一周在忙着面试,本月第一次更博,甚是想念。
基本上大公司都会要求一些算法或者数据结构类的东西,挑了些有意思的敲了下。这方面自己还不是很精通,只能一步一个脚印来积累了。
1.根据查询字符串获取对象数据,可自行根据需求选择格式,此处以key:value的格式生成
// 这里可以使用正则匹配,但仔细向后,字符串的一些基本方法完全可以解决问题
var str = 'www.test.com/test?str1=aa&str2=bb&str3=cc';
function queryStr (str) {
var target = str.substr(str.indexOf('?') + 1);
var groupItem = target.split('&');
var temp = {}
for(var i=0; i<groupItem.length; i++) {
var key = groupItem[i].split('=')[0];
var value = groupItem[i].split('=')[1];
temp[key] = value;
}
return temp;
}
console.log(queryStr(str))
2.数组随机置换,时间复杂度很重要!!
// 普通的随机置换都可以,但实际中更看重的时时间复杂度低的算法
var array = [1,5,9,6,2,6];
function tempArray (array) {
var len = array.length;
var temp = [];
while(len--) {
var ran = Math.floor( Math.random() * len);
temp.push((array.splice(ran,1))[0])
}
return temp
}
console.log(tempArray(array))
3.模拟new过程
大致分为五部:
(1) 创建一个空对象
(2)对象的__proto__属性指向构造函数的prototype对象
(3)对象的constructor属相改为构造函数
(4)更正this指针的指向
(5)返回对象
// 构造函数
function People (name, sex) {
this.name = name;
this.sex = sex;
this.eat = function () {
console.log(this.name + ' eat')
}
} function newPeople (name, sex) {
// 创建空对象
var obj = {}
// 指定__proto__ 属性
obj.__proto__ = People.prototype;
// 指定构造函数
obj.constructor = People;
// this指针更正
People.call(obj, name, sex);
// 返回对象
return obj;
} var p1 = new People('kevin','male')
var p2 = newPeople('jenny','female')
console.log(p1)
p1.eat()
console.log(p2)
p2.eat()
4.原生js实现自定义事件,面向对象思维实现
// 自定义事件类
function MyEvent () {
this.evList = {}
this.addEvent = function (type, fn) {
if(typeof fn !== 'function') return
this.evList[type] = fn
}
this.dispatchEvent = function (type, data) {
var dataObj = {}
dataObj.data = data
this.evList[type](dataObj)
}
} var ev = new MyEvent()
// 添加自定义事件
ev.addEvent('test', function (e) {
alert(e.data)
})
// 触发自定义事件
document.querySelector('.btn').onclick = function () { ev.dispatchEvent('test', 'pomelo')
}
5. 数组去重的四种方法,同样,时间复杂度很重要!!
var arr = [1,1,2,3,5,5]
// 从前向后逐个比较,相同的删除
Array.prototype.distinct1 = function () {
var arr = this;
for(var i=0; i<arr.length; i++) {
for(var j=i+1; j<arr.length; j++) {
if(arr[i] === arr[j]) {
arr.splice(j,1)
j = ++i;
}
}
}
return arr
}
// 从前向后比较,不相同的push到新数组
Array.prototype.distinct2 = function () {
var arr = this;
var temp = [];
for(var i=0; i<arr.length; i++) {
for(var j=i+1; j<arr.length; j++) {
if(arr[i] === arr[j]) {
j = ++i;
}
}
temp.push(arr[i])
}
return temp
} // 利用对象属性名不能重复的特性
Array.prototype.distinct3 = function () {
var obj = {};
var arr =this;
var temp = [];
for(var i=0; i<arr.length; i++) {
if(!obj[arr[i]]) {
temp.push(arr[i])
obj[arr[i]] = 1;
}
}
return temp
} // 利用indexOf 如果无法匹配到相同的,push进新数组
Array.prototype.distinct4 = function () {
var arr = this;
var temp = [];
arr.forEach(function (item, i) {
var num = arr.indexOf(item, i+1)
if(num === -1) {
temp.push(item)
}
})
return temp
} console.log(arr.distinct1())
console.log(arr.distinct2())
console.log(arr.distinct3())
console.log(arr.distinct4())
面试题中遇到的算法与js技巧的更多相关文章
- 常见算法是js实现汇总(转载)
常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...
- HashMap中的hash算法总结
前言 算法一直是我的弱项,然而面试中基本是必考的项目,刚好上次看到一个HashMap的面试题,今天也来学习下 HashMap中的hash算法是如何实现的. 数学知识回顾 << : 左移运算 ...
- Java面试题大全(javaSe,HTML,CSS,js,Spring框架等)
目录 1. Java基础部分 7 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2.Java有没有goto? 7 3.说说&和& ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- 分布式数据库中的Paxos 算法
分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvY ...
- iOS之在webView中引入本地html,image,js,css文件的方法 - sky//////////////////////////////////////ZZZZZZZZZZZZZZZ
iOS之在webView中引入本地html,image,js,css文件的方法 2014-12-08 20:00:16CSDN-sky_2016-点击数:10292 项目需求 最近开发的项 ...
- Java中的查找算法之顺序查找(Sequential Search)
Java中的查找算法之顺序查找(Sequential Search) 神话丿小王子的博客主页 a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数 ...
- Java中的经典算法之选择排序(SelectionSort)
Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...
- 报表开发工具中开放的部分图表js接口列表
1.. 描述 报表开发工具FineReport 8.0版本中开放了部分图表js接口,在具体应用的过程中很多人都不知道这些接口到底有什么作用,该怎么应用,所以根据我自己的应用在下面归纳了这些新开放js接 ...
随机推荐
- Wireshark理解TCP乱序重组和HTTP解析渲染
TCP数据传输过程 TCP乱序重组原理 HTTP解析渲染 TCP乱序重组 TCP具有乱序重组的功能.(1)TCP具有缓冲区(2)TCP报文具有序列号所以,对于你说的问题,一种常见的处理方式是:TCP会 ...
- 《实战Nginx》读书笔记--Nginx配置文件
先看下一份的Nginx 的配置 #user nobody nobody;#使用的用户和组 worker_processes 4;#工作进程的个数,一般等于CPU核数或者总核数的两倍 #error_lo ...
- Eclipse部署Java Web项目到Tomcat出错
1.今天,我打开Eclipse,准备将一个Java Web项目部署到Tomcat中, 结果弹出提示错误窗口,具体如下: (1)出错详情 Could not publish server configu ...
- java.text.ParseException: Unparseable date: "2015-06-09 hh:56:19"
1.错误描述 [DEBUG:]2015-06-09 16:56:19,520 [-------------------transcation start!--------------] java.te ...
- 安装STS报错(一)
安装STS报错 1.具体报错如下 2.报错原因 3.解决办法
- freemarker处理map的数据(二十)
1.简易说明 (1)map取值 (2)key取值 2.实现示例 <html> <head> <meta http-equiv="content-type&quo ...
- 慢慢人生路,学点Jakarta基础-JavaDoc标记
本文对使用Maven工程构建Jenkinsjob时遇到的问题进行一下分析汇总. JavaDoc标记使用问题 一般Maven项目都有配置产生Java DOC,但是在Jenkins里面产生DOC会有一些严 ...
- 【深入理解JVM】类加载器与双亲委派模型
原文链接:http://blog.csdn.net/u011080472/article/details/51332866,http://www.cnblogs.com/lanxuezaipiao/p ...
- 【ASP.NET Core】根据 Content-Type 头部来筛选 Action
在开始今天的吹牛节目之前,老周先说个破事:每周的周五或者周六,老周会在新浪直播平台(一直播同步)开播 ASP.NET Core 相关的内容.具体的直播时间老周会在微博上发布.直播是免费观看的,当然了, ...
- BZOJ 3527: [ZJOI2014]力(FFT)
BZOJ 3527: [ZJOI2014]力(FFT) 题意: 给出\(n\)个数\(q_i\),给出\(Fj\)的定义如下: \[F_j=\sum \limits _ {i < j} \fra ...