面试题中遇到的算法与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())

原文地址:https://www.cnblogs.com/pomelott/p/8640937.html

时间: 2024-10-24 06:16:49

面试题中遇到的算法与js技巧(一)的相关文章

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

常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.length; for(var i=0;i<len;i++){ for(var j=i+1;j<len;j++) { if(arr[i]==arr[j]) { ++i; } } newArray.push(arr[i]); } return newArray; } var arr=new Array(&

在.NET中应用MATLAB算法

在科学研究和工程应用中,往往要进行大量的数学计算,其中包括矩阵运算.这些运算一般来说难以用手工精确和快捷地进行,而要借助计算机编制相应的程序做近似计算.目前流行用Basic.Fortran和c语言编制计算程序, 既需要对有关算法有深刻的了解,还需要熟练地掌握所用语言的语法及编程技巧.对多数科学工作者而言,同时具备这两方面技能有一定困难.通常,编制程序也是繁杂的,不仅消耗人力与物力,而且影响工作进程和效率.为克服上述困难,美国Mathwork公司于1967年推出了"Matrix Laborator

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

Java中的经典算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复第一趟步骤,直至全部排序完成. 举例说明:要排序数组:int[] arr={6,3,8,2,9,1}; 第一趟排序: 第一次排序:6和3比较,6大于3,交换位置:  

检测字符串中是否含有非法字符js代码

检测字符串中是否含有非法字符js代码:通常情况下,网站输入的字符串内容是需要经过检测的,因为有些字符带有一定的危险性,会对站点带来一定的危害,下面就介绍一下如何检测一个字符串是否含有非法字符,代码如下: function checks(str){ szMsg="[#_%&'\",;:=!^]"; alertStr=""; for(i=1;i<szMsg.length+1;i++){ if(str.indexOf(szMsg.substring

STL笔记(6)标准库:标准库中的排序算法

STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew Austern http://www.cuj.com/experts/1908/austern.htm?topic=experts 用泛型算法进行排序    C++标准24章有一个小节叫“Sorting and related operations”.它包含了很多对已序区间进行的操作,和三个排序用泛型

数字图像处理之快速中值滤波算法

快速中值滤波算法 中值滤波算法: 在图像处理中,在进行如边缘检测这样的进一步处理之前,通常需要首先进行一定程度的降噪.中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声.这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能.观察窗口中的数值进行排序,位于观察窗中间的中值作为输出.然后,丢弃最早的值,取得新的采样,重复上面的计算过程.中值滤波是图像处理中的一个常用步骤,它对于斑点噪声和椒盐噪声来说尤其有用.保存边缘的特性使它在不希

STL中的查找算法

STL中有很多算法,这些算法可以用到一个或多个STL容器(因为STL的一个设计思想是将算法和容器进行分离),也可以用到非容器序列比如数组中.众多算法中,查找算法是应用最为普遍的一类. 单个元素查找 1. find() 比较条件为元素是否相等的查找: template <class InputIterator, class T> InputIterator find (InputIterator first, InputIterator last, const T& val); 2.fi

游戏中的AI算法总结与改进

参考文章: http://games.sina.com.cn/zl/duanpian/2014-03-11/105973.shtml http://www.oschina.net/translate/understanding-steering-behaviors-collision-avoidance?cmp http://blog.csdn.net/ityuany/article/details/5509750 一. 人工智能的定义 人工智能(AI, Artificial Intellige

计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法

中点画圆算法 如同光栅画线算法,我们在每个步中以单位间隔取样并确定离指定圆最近的像素位置.对于给定半径r和屏幕中心(xc,yc),可以先使用算法计算圆心在坐标原点(0, 0)的圆的像素位置,然后通过将xc加到x且yc加到y.从而把计算出的每个位置(x,y)移动到其适当的屏幕位置.在第一象限中,圆弧段从x = 0到x = y,曲线的斜率从0变化到-1.0.因此,可以在该八分圆上的正x方向取单位步长,并使用决策参数来确定每一步两个可能的y位置中,哪一个更接近于圆的位置.然后,其他七个八分圆中的位置可