今天去面试,被问到了如下问题:git
从1000个正整数中找出最大的五个数
思路:先生成一个含1000个数的随机数组Arr1,而后创建一个空数组Arr2,及一个变量max=0。
而后遍历Arr1,其中大于max的数存入数组2。便利事后,获得递增数组Arr2。
用slice方法取Arr2后五位即为最大五位。
`github
var Arr1 = []; for (var i = 0; i<1000; i++){ Arr1[i] = Math.floor(Math.random()*1000+1); }; //先生成1000个正整数 var Arr2 = new Array(); var max = 0; for (var i = 0; i<1000; i++){ if (Arr1[i]>max){ Arr2.push(Arr1[i]); max = Arr1[i]; } }; var result = Arr2.slice[-5]; console.log(result);
`
运行结果以下:面试
这个算法看似能找出最大数,可是存在如下问题:
当Arr1为[100,999,...,1]这样的递减数列时,只能找出第一个最大数,没法将Arr2凑满。并且,面试官还问到了时间复杂度的问题,当时我并无概念。算法
为妥善解决问题,仍是将Arr1数组从小到大从新排列,这样就不会受到原数据中大小次序影响。
所以能够采用算法学中的排序方法,如冒泡排序、选择排序、插入排序等。数组
算法复杂度的概念(包括时间复杂度和空间复杂度):dom
http://blog.csdn.net/booirror...
http://www.jianshu.com/p/99ba...
排序算法的Javascript实现:优化
https://github.com/damonare/S...
以前解法的时间复杂度为O(n)。
如今采用更稳妥的,可排序的冒泡排序算法,时间复杂度为O(n*n)。代码实现以下:spa
var Arr1 = []; for (var i = 0; i<1000; i++){ Arr1[i] = Math.floor(Math.random()*1000+1); }; function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j+1]) { //相邻元素两两对比 var temp = arr[j+1]; //元素交换 arr[j+1] = arr[j]; arr[j] = temp; } } } return arr; } var Arr2 = bubbleSort(Arr1); var result = Arr2.slice(-5); console.log(result);
代码运行截图: .net
显然,实现了目的,可是算法上还能够采用时间复杂度更低的算法。code