近一周在忙着面试,本月第一次更博,甚是想念。

基本上大公司都会要求一些算法或者数据结构类的东西,挑了些有意思的敲了下。这方面自己还不是很精通,只能一步一个脚印来积累了。

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技巧的更多相关文章

  1. 常见算法是js实现汇总(转载)

    常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...

  2. HashMap中的hash算法总结

    前言 算法一直是我的弱项,然而面试中基本是必考的项目,刚好上次看到一个HashMap的面试题,今天也来学习下 HashMap中的hash算法是如何实现的. 数学知识回顾 << : 左移运算 ...

  3. Java面试题大全(javaSe,HTML,CSS,js,Spring框架等)

    目录 1. Java基础部分 7 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2.Java有没有goto? 7 3.说说&和& ...

  4. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  5. 分布式数据库中的Paxos 算法

    分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvY ...

  6. iOS之在webView中引入本地html,image,js,css文件的方法 - sky//////////////////////////////////////ZZZZZZZZZZZZZZZ

    iOS之在webView中引入本地html,image,js,css文件的方法   2014-12-08 20:00:16CSDN-sky_2016-点击数:10292     项目需求 最近开发的项 ...

  7. Java中的查找算法之顺序查找(Sequential Search)

    Java中的查找算法之顺序查找(Sequential Search) 神话丿小王子的博客主页 a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数 ...

  8. Java中的经典算法之选择排序(SelectionSort)

    Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...

  9. 报表开发工具中开放的部分图表js接口列表

    1.. 描述 报表开发工具FineReport 8.0版本中开放了部分图表js接口,在具体应用的过程中很多人都不知道这些接口到底有什么作用,该怎么应用,所以根据我自己的应用在下面归纳了这些新开放js接 ...

随机推荐

  1. SQL总结手册

    1.SQL语法 (1)查询 SQL查询是使用最多的,需要凭借结构.索引和字段类型等因素.大多数据库含有一个优化器(optimizer),把用户查询转换为可选形式,以提高查询效率. 基本语法为: SEL ...

  2. Linux下Nodejs安装

    网上有很多node安装方法,最好用的应该是在windows下载nodejs linux版本,安装包移植到ubuntu中, 下载下来的是个双重压缩的文件.tar.xz,先解压xz,再解压tar xz - ...

  3. linux dns子域授权 split分离解析 缓存dns服务器

    DNS子域授权作用:适用于同一个DNS组织父/子域名的解析工作由不同的dns服务器负责父dns服务器应该有为子域名迭代的能力 上下级区域属于不同的机构管理:.cn与.Anonymous.cn.cn需要 ...

  4. 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式

    由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常.   主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...

  5. final、finally和finalize的区别

    final.finally和finalize的区别 这三者的区别可以从两个方面来说 1.意思解释方面 (1)final是修饰符(关键字) (2)finally是异常处理中的程序块 (3)finaliz ...

  6. Unhandled event loop exception Java heap space

    1 错误描述 2 错误原因 3 解决办法

  7. freemarker之list遍历(八)

    1.设置数据源 /** * * @Title:student * @Description: * @param:@param name * @return: void * @throws */ pri ...

  8. Python Cookbook(第3版)中文版:15.15 C字符串转换为Python字符串

    15.15 C字符串转换为Python字符串¶ 问题¶ 怎样将C中的字符串转换为Python字节或一个字符串对象? 解决方案¶ C字符串使用一对 char * 和 int 来表示, 你需要决定字符串到 ...

  9. NOIP2017总结

    NOIP2017 总结 今年又炸飞天了,day1T1T2加起来不到100分,T3只有10分--怕真的要AFO了. 和去年一模一样day1炸飞天,day2虽然发挥正常但也无力回天 day1 Day1T1 ...

  10. Luogu P1860 新魔法药水

    题目大意 具体题面及输入格式戳我! 商店里有\(N\)种药水,每种药水都有一个售价和回收价. 小\(S\) 攒了\(V\)元钱,还会\(M\)种魔法,可以把一些药水合成另一种药水. 他在第一天可以购买 ...