以下为笔者练习总结
二分查找
function bsearch(arr, val) { var arr =[].concat(arr), low = 0, high = arr.length - 1 while(low <= high){ var mid = Math.floor(low + (high - low) / 2)//防止high+low超出上限 if(val === arr[mid]){ return mid }else if(val > arr[mid]){ low = mid + 1 }else if(val < arr[mid]){ high = mid -1 } } return -1 }
数组全排列
function permutate(str) { var result=[]; if(str.length===1){ return [str] }else{ var preResult=permutate(str.slice(1)); for (var j = 0; j < preResult.length; j++) { for (var k = 0; k < preResult[j].length+1; k++) { var temp=preResult[j].slice(0,k)+str[0]+preResult[j].slice(k) result.push(temp) } } return result } }
去重
let a=["1",1,2,3,5,4,2,4,1,6]; [...(new Set(a))]; //["1", 1, 2, 3, 5, 4, 6] Array.from(new Set(a)); //["1", 1, 2, 3, 5, 4, 6] function unique(arr){ let temp={},result=[]; arr.concat().forEach(item=>{ if(!temp[typeof(item)+item]){ result.push(item); temp[typeof(item)+item]=1; } }) return result } unique(a); //["1", 1, 2, 3, 5, 4, 6]
寻找重复次数最多或最少的元素
let a=[1,2,3,2,4,5]; console.log(max(a)); //2 console.log(min(a)); //1 function max(arr) { let temp = {},max=arr[0]; for (let i=0,l=arr.length;i<l;i++) { if (!temp[arr[i]]) { temp[arr[i]] = 1; } else { temp[arr[i]]++; } } for(let x in temp){ max=temp[x]>temp[max]?x:max; } return max } function min(arr) { let temp = {},min=arr[0]; for (let i=0,l=arr.length;i<l;i++) { if (!temp[arr[i]]) { temp[arr[i]] = 1; } else { temp[arr[i]]++; } } for(let x in temp){ min=temp[x]<temp[min]?x:min; } return min }
寻找第一个未重复的元素
let a=[1,2,3,4,3,2,1,5]; function get(arr){ let result=[],temp=arr.concat(); temp.forEach(item=>{ if(temp.indexOf(item)===temp.lastIndexOf(item)) result.push(item); }); return result[0]; } get(a); //4
寻找两数组最小的相同元素
let a=[1,5,2,3],b=[3,2,4,1]; function get(arr1,arr2){ let a1= arr1.concat().sort((a,b)=>a-b), a2 = arr2.concat().sort((a,b)=>a-b), s=new Set(a2); return a1.filter(item=>s.has(item)).sort((a,b)=>a-b)[0]; } get(a,b); //1
展开多维数组
let arr = [1,2,[3],4,[5,[6]]]; function get(arr) { for (let i in arr) { if (Array.isArray(arr[i])) { arr.splice(i, 1, ...get(arr[i])); } } return arr } get(arr); //[1,2,3,4,5,6]
差集、交集
let a=[1,2,3,5],b=[1,2,5],s=new Set(b); //差集 a.filter(item=>!s.has(item)); //[3] //交集 a.filter(item=>s.has(item)); //[1,2,5]