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

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

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. 用Node.JS+MongoDB搭建个人博客(model目录)(三)

    model目录主要是封装一些经常使用的方法,便于使用. setting.js文件: 很简单,就单单封装了一个url作为公用,以后改就方便改了. md5.js(不推荐用): db.js文件: db.js ...

  2. java线程池的原理及实现

    1.线程池简介:     多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.         假设一个服务器完成一项任务所需时间为:T1 ...

  3. JSP标签c:forEach报错(二)

    1.今天,我在用c标签写一些样例,结果出现一些错误,写下作为记录 具体错误如下: 三月 31, 2014 9:46:28 下午 org.apache.catalina.core.StandardWra ...

  4. 错误代码: 1449 The user specified as a definer ('root'@'%') does not exist

    1. 错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:call analyse_use('20150501','20150601 ...

  5. VxWorks启动过程详解(上)

    vxworks有三种映像: VxWorks Image的文件类型有三种 Loadable Images:由Boot-ROM引导通过网口或串口下载到RAM ROM-based Images(压缩/没有压 ...

  6. day8(字符串操作)

    一.字符串操作 1.index  #返回字符串的索引值 s = "Hello word" print(s.index('o')) 2.isalnum #检测字符串是否由字母和数字组 ...

  7. Struts2(三) 配置struts.xml的提示(在不联网的情况下)

    开发过程中如果可以上网,struts.xml 会自动缓存dtd,提供提示功能.如果不能联网需要我们配置本地dtd,这样才能让struts2 产生提示 1.首先,在EClipse中依次点击工具栏中的wi ...

  8. Struts2(七) Struts2访问Servlet的API

    当接受表单参数,向页面保持数据时.要用到Struts访问Servlet 的API .下面只做参考,有错误或不同意见可以发送邮箱2440867831@qq.com  .建议大家看struts文档,源代码 ...

  9. 拥抱.NET Core系列:MemoryCache 缓存域

    在上一篇“<拥抱.NET Core系列:MemoryCache 缓存选项>”我们介绍了一些 MSCache 的机制,今天我们来介绍一下 MSCache 中的缓存域. MSCache项目 M ...

  10. BZOJ 5039: [Jsoi2014]序列维护

    5039: [Jsoi2014]序列维护 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 282  Solved: 169[Submit][Status ...