平时感觉自己挺牛逼的啊,怎么一面试就各种懵比了!这样的问题各位做为程序猿想必会经常遇到,下面写写今天的面试让我心里很不开心的一件事情,问题很简单,简单到无法原谅自己的地步,下面我们开始
1、问题是介个样子滴:小伙,用递归来段阶乘的代码呗!
尼玛这个当然很简单啊,可惜瞬间脑子短路了,过后回想起来抽自己两巴掌先!这种错误不可饶恕
那么现在我们来写下用递归来实现段阶乘
拿到需求肯定是要先分析一下滴
1.首先你得知道什么事阶乘,所有小于及等于该数的正整数的积,并且有0的阶乘为1。 自然数n的阶乘写作n!,比如10的阶乘10!=10*9*8*7*6*5*4*3*2*1
2.其次你得判断当用户传入的值为小于1或等于1的时候返回的值应该是1
3.最后得出以下的结果
1 function fn ( n ) {
2 return ( n <= 1 ) ? 1 : ( n * fn ( n - 1 ) ) ;
3 }
2、怎样清空一个数组
我当时说的是第一种
1、赋值为一个空数组以达到清空原数组,我比较菜,面试经验也少,基础也比较薄弱,所以反应也不是很快,就只想到了这个,这种办法其实好像并没有真正的清空,只是把原来的数组变为了空数组,我不是很明白,是不是有其他的数组应用了原数组的话就不会被垃圾回收?希望有大神看到后给解答一下,谢谢,先看下代码
var arr1 = [1,2,3,4] var arr2 = arr1 arr1 = []; console.log(arr1); console.log(arr2); // [] // [1, 2, 3, 4]
2、将length赋值为0;当时面试官给我说的也是这一种,他的原话是为什么不把数组的长度置为0呢,你的做法(指第一种)岂不是又开辟了一个新的内存地址;
回来之后都尝试了一下,一看,把原数组的长度置为0之后所有指向它的其他数组都变为空数组了,下面看代码
var arr1 = [1,2,3,4] var arr2 = arr1 arr1.length = 0; console.log(arr1); console.log(arr2); // [] // []
3、利用数组的万能函数来清空数组
// 伪代码 arr1.splice(0,arr1.length); // 解释一下,splice方法接受的第一个参数是指数组的下标位置,即删除/添加的起始位置,第二个参数是删除的数量,如果是0则不删除,第三个参数是可选参数,就是往数组添加新元素 var arr1 = [1,2,3,4]; var arr2 = arr1; arr1.splice(0,arr1.length); console.log(arr1); console.log(arr2); // [] // []
当时的面试官问的是最快的方法,下面做下测试(都在google浏览器做的测试)
1、
var arr1 = [] for(var ii = 0 ;ii<10000000;ii++){ arr1.push(ii) } var arr2 = arr1 var start = new Date().getDate() arr1 = [] var end = new Date().getDate() console.log(end-start) // 0
2、
var arr1 = [] for(var ii = 0 ;ii<10000000;ii++){ arr1.push(ii) } var arr2 = arr1 var start = new Date().getDate() // arr1 = [] arr1.length = 0 // arr1.splice(0,arr1.length) var end = new Date().getDate() console.log(end-start) // 0(google浏览器)
3、
var arr1 = [] for(var ii = 0 ;ii<10000000;ii++){ arr1.push(ii) } var arr2 = arr1 var start = new Date().getDate() // arr1 = [] // arr1.length = 0 arr1.splice(0,arr1.length) var end = new Date().getDate() console.log(end-start) // 0
我都是在google浏览器上做的测试没看出有多大的区别,看到有园友做的测试:http://www.cnblogs.com/snandy/archive/2011/04/04/2005156.html
他得出的结论是赋值为一个空数组以达到清空原数组即arr1 = []的办法更快更高效