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

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

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. python内置函数-compile()

    python的内置函数 compile()--编译. 这个函数有什么用呢? 一个最简单的例子, 就是我们的代码, 会被解释器读取,解释器读取后的其实是字符串, 然后通过compile编译后, 又转换成 ...

  2. 企业内部DNS跨国配置案例

    背景介绍:总公司与北京分公司均由总公司进行统一管理.总公司的主从DNS担任解析总公司服务器与北京分公司的服务器解析任务.总公司DNS委派其他两个公司管理自己域下的服务器解析任务.要求任何一个节点都能解 ...

  3. java调用shell脚本,并获得结果集的例子

    /** * 运行shell脚本 * @param shell 需要运行的shell脚本 */ public static void execShell(String shell){ try { Run ...

  4. 关于chrom开发者工具priview和respons 数据内容不一致问题

    在昨天晚上2017年8月24日,深夜升级的时候发现你了一个问题:简单的把问题描述一下:新增的一个付款单中的金额为最大值9999999999999999 ,但是保存后返回来的却是100000000000 ...

  5. java 集合框架(十六)Map

    一.概述 Map是一个包含键值对的集合,一个map不能有重复的键(key),而且每个键至多只能对应一个值.Map同Collection一样,它的所有通用实现都会提供一个转换器构造函数,接收一个Map类 ...

  6. 修正uboot网络不可用

    通过使用uboot的网络功能可以更新ubook,烧写内核,文件系统,如果网络功能不可能,那还不如同变砖了一样.当然如果支持sd卡启动,可能通过sd卡完成这些功能,但是也太过麻烦了.飞凌的6410开发板 ...

  7. 【mongodb系统学习之十】mongodb查询(一)

    十.mongodb查询:find ;查询时条件中不能引用文档中其他键的值: 1).查询数据库全部数据:语法db.collectionName.find();默认只显示前20条,如图: 2).按条件查询 ...

  8. Flash Builder4破解步骤

    Flash Builder4破解步骤 1.安装Flash Builder4.0试用版 2.找到Flash Builder4的安装路径,查找如下相应的文件 3.修改如下文件下的文件 (1)找到Adobe ...

  9. Django学习-24-Ajax

    jQuery.Ajax是原生Ajax的封装,它能自动识别浏览器的Ajax对象HttpResponse(status='404',reason='Page Not Found') 原生Ajax使用Xml ...

  10. freemarker定义一个连续的序列(十九)

    1.简易说明 定义一个连续的序列,并打印出序列中的元素 2.实现源码 <#--freemarker定义了一个连续的序列--> <#assign nums=1..100/> &l ...