写在前面:
本人自学前端不久,博客的【学习笔记】既不算原创也不算转载,都是自己通过各个网站、博客、书籍、视频课程等学习的笔记,以及做的一些测试。
下面的代码是在sublime text3上编辑在nodejs上运行过的。
//利用object对数组去重 var a=[1,2,3,4], b=[3,4,5,6], c=a.concat(b), obj={}, arr=[]; c.map(function(item){ obj[item]=null; }) for(var key in obj){ arr.push(Number(key)); } console.log(arr);//[ 1, 2, 3, 4, 5, 6 ] console.log('--------------------------------'); //在数组中间添加数组 var nums = [1,2,3,4,5,6,7]; var newElements = ['a',100]; nums.splice(Math.floor(nums.length / 2),0,newElements); console.log(nums);//[ 1, 2, 3, [ 'a', 100 ], 4, 5, 6, 7 ] var nums = [1,2,3,4,5,6,7]; nums.splice(Math.floor(nums.length / 2),0,'a',100); console.log(nums);//[ 1, 2, 3, 'a', 100, 4, 5, 6, 7 ] var nums = [1,2,3,4,5,6,7]; var newElements = ['a',100]; nums.splice.apply(nums, [Math.floor(nums.length)/2, 0].concat(newElements)) console.log(nums);//[ 1, 2, 3, 'a', 100, 4, 5, 6, 7 ] console.log('--------------------------------'); //找出给定字符串中出现次数最多的字母 function findMaxChar(str){ if(str.length<=1){ return str; } var obj={},char,count=1; for (var i = 0; i < str.length; i++) { if(!obj[str.charAt(i)]){ obj[str.charAt(i)]=1; }else{ obj[str.charAt(i)]+=1; } } for(var key in obj){ if(obj[key]>=count){ count=obj[key]; char=key; } } return char; } console.log(findMaxChar('fafdfdfaaakkkkkkkkklepoepwkkk'));//k console.log('--------------------------------'); //杨辉三角 var row=8, array=new Array();//[] for (var i = 0; i < row; i++) { var arrays=[]; for (var j = 0; j < i+1; j++) { if(i==0||j==0||j==i){ arrays.push(1); }else{ arrays.push(array[i-1][j-1]+array[i-1][j]); } } console.log(arrays); array.push(arrays); } /** [ 1 ] [ 1, 1 ] [ 1, 2, 1 ] [ 1, 3, 3, 1 ] [ 1, 4, 6, 4, 1 ] [ 1, 5, 10, 10, 5, 1 ] [ 1, 6, 15, 20, 15, 6, 1 ] [ 1, 7, 21, 35, 35, 21, 7, 1 ] */ console.log('--------------------------------'); //二分算法 //只能对已排好序的数组进行查找 var arr=[0,1,2,35,46,57,68,79]; function getIndex(array,value){ var a=0,b=array.length-1; while(a<=b){ var m=Math.floor((a+b)/2); if(value==array[m]){ return m; }else if(value>array[m]){ a=m+1; }else{ b=m-1; } } return -1;//没有找到元素返回-1 } console.log(getIndex(arr,68));//6 console.log(getIndex(arr,11));//-1 console.log('--------------------------------'); var arr=[324,42,3,-5,27,99,0]; console.log(arr.sort(function(a,b){return a-b;}));//[ -5, 0, 3, 27, 42, 99, 324 ] console.log(arr);//[ -5, 0, 3, 27, 42, 99, 324 ] sort改变原数组 console.log(arr.sort(function(a,b){return b-a;}));//[ 324, 99, 42, 27, 3, 0, -5 ] console.log('--------------------------------'); //冒泡排序 //时间复杂度O(n^2),是稳定的算法 //稳定的含义是:稳定排序算法会让原本有相等键值的纪录维持相对次序 // //从小到大排:(从大到小换成把小的往后扔就可以了) //依次比较相邻元素,保证较大的在后面 //一次遍历后,最大的数在最后面 //除去已扔到最后面的最大的数,对前面的元素重复上述步骤 //每次遍历后,需要比较的数少一个,重复直到没有元素可以比较 function bubbleSort(array){ if(array.length<=1){ return array; } for (var i = 0; i < array.length; i++) { for (var j = 0; j < array.length-1-i; j++) { if(array[j]>array[j+1]){ var temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } } } return array; } var arr=[324,42,3,-5,27,99,0]; console.log('bubbleSort: '+bubbleSort(arr));//bubbleSort: -5,0,3,27,42,99,324 console.log('--------------------------------'); //快速排序: //时间复杂度 O(nlogn),不稳定的排序 // //通过与一个中介元素比较,将要排序的数据分割成独立的3部分, //一部分所有数据都比中介小,另外一部分的所有数据都比中介大,中介自成一部分, //对非中介的两部分重复上述步骤,每次结束将三部分按顺序连接, //直到整个数组变成有序序列 function quickSort(array){ if(array.length<=1){ return array; } var m=array.splice(Math.floor(array.length/2),1)[0]; var left=[],right=[]; for (var i = 0; i < array.length; i++) { if(array[i]<m){ left.push(array[i]); }else{ right.push(array[i]); } } return quickSort(left).concat(m,quickSort(right)); } var nums = [324,42,3,-5,27,99,0]; console.log('quickSort: '+quickSort(nums));//quickSort: -5,0,3,27,42,99,324 console.log('--------------------------------'); //选择排序 //O(n^2),不稳定 //每次遍历找到最小的数,从前往后放 function selectionSort(array){ if(array.length<=1){ return array; } for (var i = 0; i < array.length; i++) { var index=i; for(var j=i+1;j<array.length;j++){ //找到最小数的下标赋值给index if(array[j]<array[index]) index=j; } var temp=array[i]; array[i]=array[index]; array[index]=temp; } return array; } var arr=[324,42,3,-5,27,99,0]; console.log('selectionSort: '+selectionSort(arr));//selectionSort: -5,0,3,27,42,99,324 console.log('--------------------------------'); //插入排序 //O(n^2),稳定 //把数组分为已排序和未排序两个部分 //对未排序数据在已排序序列中从后向前扫描插入 function insertionSort(arr){ if(arr.length<=1){ return arr; } for (var i = 1; i < arr.length; i++) { //已排序序列中只有arr[0] var temp=arr[i];//保存待插入数据 for(var j=i-1;j>=0 && arr[j]>temp;j--){ //在已排序序列中从后往前扫面,遇见比待排序数据大的则逐个往后移 arr[j+1]=arr[j]; } arr[j+1]=temp; } return arr; } var arr=[324,42,3,-5,27,99,0] console.log('insertionSort: '+insertionSort(arr));//insertionSort: -5,0,3,27,42,99,324 console.log('--------------------------------'); //希尔排序(增量排序) //复杂度O(nlog2n),不稳定 //由多次插入排序完成 //根据指定步长对元素进行分组 //如步长为3时,11个元素的数组分组结果为: //\0 3 6 9 \ 1 4 7 10 \ 2 5 8 \ //减少步长直到1,进行最后一次插入排序 function shellSort(arr){ if(arr.length<=1){ return arr; } var gap=Math.floor(arr.length/2); for(;gap>0;gap=Math.floor(gap/2)){ for (var i = 0; i < gap; i++) { //分组进行插入排序 for (var j = i; j < arr.length; j+=gap) { var temp=arr[j]; for(var k=j-1;k>=0 && arr[k]>temp;k--){ arr[k+1]=arr[k]; } arr[k+1]=temp; } } } return arr; } var arr=[324,42,3,-5,27,99,0] console.log('shellSort: '+shellSort(arr));//shellSort: -5,0,3,27,42,99,324 console.log('--------------------------------'); //归并排序 //O(nlogn),稳定 //建立在归并操作上 function merge(arr1,arr2){ var temp=[],i=0,j=0; while(i<arr1.length && j<arr2.length){ if(arr1[i]<=arr2[j]){ temp.push(arr1[i]); i++; }else{ temp.push(arr2[j]); j++; } }//end while return temp.concat(arr1.slice(i)).concat(arr2.slice(j)); } function mergeSort(arr){ if(arr.length<=1){ return arr; } var m=Math.floor(arr.length/2); var arr1=arr.slice(0, m); var arr2=arr.slice(m); return merge(mergeSort(arr1), mergeSort(arr2)); } var arr=[324,42,3,-5,27,99,0] console.log('mergeSort: '+mergeSort(arr));//mergeSort: -5,0,3,27,42,99,324 console.log('--------------------------------');