算法题练习

238 阅读2分钟

1.下题需要用promise进行封装,保证输出的顺序

for (var i = 0; i < 5; i++) {
    setTimeOut(function(){
        console.log(new Date(), i);
    }, 1000);
}
console.log(new Date(), i)
function consoless () {
    return new Promise(function(resolve, reject){
        for (var i = 0; i < 5; i++) {
            setTimeout(function() {
                console.log(new Date(), i);
            }, 1000);
        }
        resolve(i);
    })
}
consoless().then(res => {
    console.log(new Date(), res);
})

2.将每一项进行输出

for (var i = 0; i < 5; i++) {
    setTimeOut(function(){
        console.log(new Date(), i);
    }, 1000);
}
console.log(new Date(), i)
for (var i = 0; i < 5; i++) {
    function a(i){
        setTimeOut(function(){
            console.log(new Date(), i);
        }, 1000);
    }
    a(i);
}
console.log(new Date(), i)

3.二分法查找

给定一个有序(非降序)数组A,可能含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1。

array=[1,2,3,5,6,7,7,10]; target = 7, return 5 target = 8, return -1

function search (arr, target) {
    let len = arr.length;
    if (len <= 0) {
        return -1;
    }
    let start = 0;
    let end = len - 1;
    while (start <= end) {
        let mid = Math.floor((start + end)/2);
        if (arr[mid] == target) {
            if (mid - 1 >= 0 && arr[mid - 1] == target) {
                end = mid - 1;
            } else {
                return mid;
            }
        } else if (arr[mid] > target) {
            end = mid - 1;
        } else {
            start = mid + 1;
        }
    }
    return -1;
}
    console.log(search([1,2,3,5,6,7,7,7,7,7,7,10], 7));

4.数组扁平化

var arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10]

//扁平化:第一种
function fn(arr) {
  let list = []
arr.forEach((item) => {
  if(Object.prototype.toString.call(item) === '[object Array]') {
    fn(item)
  } else {
    if(!list.includes(item)) {
      list.push(item)
    }
  }
})
return list
}
//扁平化:第二种
function fn(arr) {
    return arr.flat(Infinity)//Infinity表示深度扁平化
}

//去重:第一种
 const fn = (arr: any) => {
    
    return arr.filter((item: any, index: number) => {
      return arr.indexOf(item) === index
    })
  }
  
  //去重:第一种
  const fn = (arr: any) => {
      return arr.reduce((list, current) => {
          if (!list.includes(current)) {
            list.push(current)
          }
          return list
        }, [])
  }
  
  //去重:第三种
  const fn = (arr: any) => {
       return Array.from(new Set(arr)) 
  }
  
  //数组扁平化最简单方式
  
  const fn = (arr: any) => {
      return Array.from(new Set(arr.flat(Infinity)))
  }
  
  

输入数组 ['A1', 'B1', 'A2', 'C1', 'B2', 'C2', 'D1', 'D2'] 和['B', 'A', 'D', 'C'],输出结果为['A', 'A1', 'A2', 'B', 'B1', 'B2', 'C', 'C1', 'C2', 'D', 'D1', 'D2']

const array1 = ['A1', 'B1', 'A2', 'C1', 'B2', 'C2', 'D1', 'D2']
    const array2 = ['B', 'A', 'D', 'C']
    let list: any = []
    array2.sort().forEach((itemForeach: any) => {
      let listTemp = array1.filter((itemFilter: any) => {
        return itemFilter.indexOf(itemForeach) !== -1
      })
      list = list.concat(itemForeach, listTemp)
    })
    console.log('list999', list)
for(var i = 0; i < 10; i++) {
  setInterval(() => {
    console.log(i)
  }, 1000)
}
for(let i = 0; i < 10; i++) {
  setInterval(() => {
    console.log(i)
  }, 1000)
}    
for(var i = 0; i < 10; i++) {
    (function(i){
        setInterval(() => {
            console.log(i)
          }, 1000)
    }(i))
}