从 前端算法 到 js深度学习

分享一些常用的数组方法:

压平数组(Array.prototype.contact的妙用)

  [].concat.apply([],[[1,2],3,[4,5,6]])
  打印: [1, 2, 3, 4, 5, 6]

数组拍平与迭代器的运用

问题描述:编写一个 JavaScript generator 函数,接受一个仅包含数字的 多维数组 ,返回一个迭代器,可以遍历得到它拍平以后的结果。例如:

const numbers = flatten2([1, [[2], 3, 4], 5])
numbers.next().value // => 1
numbers.next().value // => 2
numbers.next().value // => 3
numbers.next().value // => 4
numbers.next().value // => 5

答案:

function *flatten2 (arr) {
  for(let a of arr) {
    Array.isArray(a) ? yield* flatten2(a) : yield a
  }
}

数组去重 (es6 set 用法)

[ ...new Set([1, 2, 3, 1, 5]) ]
或者
Array.from(new set([1, 2, 3, 1, 5]))

爬楼梯(斐波那契数列——解构与循环优化递归算法)

问题描述: 有若干阶楼梯,每一次爬一节或者两节,问有多少种方法?

//采用动态规划方案 
function climb(n){
             if (n == 1)  return 1
             if (n == 2)  return 2
             let n1 = 1
             let n2 = 2
             for(var i = 3; i < n; i++){
                [n1, n2] = [n2, n1 + n2] 
             } 
             return n1 + n2
     }

//传统递归
function fb(n){
            if(n == 1 || n == 2){ return n} 
            return fb(n-1) + fb(n - 2)
   }

数组空位填充(数组下标的应用与理解)

问题:JavaScript 数组有空位的概念,也就数组的一个位置上没有任何的值。例如:

[ , , 'Hello'] // => 0, 1 都是空位, 3 不是空位

要求: 把空位都填充为 'Hello’

let arr = [ , undefined, null , 'Hello']
  for(var i = 0; i < arr.length; i++){
      if(!(i in arr)){
          arr[i] = 'Hello'
        }
   }
 console.log(arr)

数组中的数据划分(解构与while)

问题描述:
完成一个函数 partition,它接受一个数组作为参数。它会搬动数组中的元素,使得所有小于第一个项的元素都搬动到它的左边,所有大于第一个项的元素都搬动到右边。例如:

const arr = [3, 1, 6, 2, 4, 5]
partition(arr)
console.log(arr) // => [2, 1, 3, 6, 4, 5]

解析

const partition = (arr) => {
  const swap = (a, i, j) => [a[i], a[j]] = [a[j], a[i]]  //解构赋值,很常用
  
  const v = arr[0]
  let i = 0
  let k = 1
  let j = arr.length - 1
  
  while(k <= j) {
    if(arr[k] < v) swap(arr, i++, k++)  
    else if(arr[k] > v) swap(arr, j--, k) 
    else k++
  }
}

你可能感兴趣的:(从 前端算法 到 js深度学习)