以下为笔者练习总结
二分查找
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]