前端刷算法用什么语言?

选择JS

Leecode可以用js刷题,我的大js越来越被认可了吧?但是js的一些特性会在你刷题的时候掉坑。我来总结一下我摔的坑。

pit 1: JS中的数组对象是一个引用对象。

在js中,除了object,数组对象也是引用对象,这一点经常被忽略。所以递归传递数组时,要用arr.slice(0)复制一个新的数组,否则你传入的数组会被递归改变相同的级别,结果是错误的。

所以只要复制数组,最好是这样写,除非你真的要引用。请注意,切片和拼接之间有很大的区别。如果使用splice(0),也可以复制阵列,但会删除原始阵列,因为splice是一个操作。

添加和删除的元素,返回值是删除元素的集合。Splice(0)表示从idx删除到数组末尾,所以返回值也是这个数组。Slice(开始,结束)可以理解为切片。省略end意味着转到数组的末尾。如果end为负,

从数组末尾开始计数。

Pit 2: JS中的排序默认是按照字典顺序排序的。

一般在排序的时候,认为如果是升序的话就不需要写compare函数了。但是js中的arr.sort()是按字典顺序排序的,这就导致你在数组非负的情况下使用sort就能得到想要的效果,但如果有负数就错了。

比如arr=?

所以记得写比较函数,不要偷懒,最好写匿名函数。

坑三:函数没有变量提升。

其实这个一般不容易犯,主要是我当时和二坑结合了。我在自定义比较函数的时候,写的是VARCompare = function (a,b){ returnb;},没错,但是我是写在sort下的,所以sort找不到compare函数,所以按照默认的字符顺序排列。

我觉得compare的定义有问题。在函数中定义变量有一个“变量提升”,就是在函数的任何地方定义vara,就相当于在函数的开头定义vara,所以习惯了之后,你就忘了函数不是变量,没有变量提升。你找不到下面的定义。所以当编写比较函数时,

把它写成匿名函数。

坑四:浮点数运算不准确

试试console.log(0.3-0.2)你会发现是0.00998.999999998995我发现js只要有奇数浮点数就不能准确计算。这应该和js中浮点数存储的机制有关。这个问题没有好的解决办法。一般来说,答案是保留2或3位小数,用fixed (n)直接保留。

n位就够了,这个方法本来就是四舍五入的。但是总有想取上下界而不是取四舍五入的情况,所以只能通过一些方法来黑。比如你想取前两位:(a * 100-b * 100)/100。

坑五:判断数组为空。

如果(!Arr),因为数组不像变量那样隐式转换,所以可以使用arr . length >;0,但是在某些情况下,可能那个变量不是数组,所以不能去长,所以我在网上看到了一个比较全面的方法,就是先判断对象。

底部是否是数组类型,再拿长度来判断。