JavaScript 算法题集

60 阅读1分钟

1、两数之和:

let arr = [3, 7, 10, 2, 9, 1, 4]
// for 暴力循环  -- 执行时间 sum1: 0.347900390625 ms
function twoNumsSum(arr, target) {
  for (let i = 0; i < arr.length; i++) { 
    for (let j = 0; j < arr.length; j++) {
      if (target - arr[i] === arr[j] && i !== j) return [i, j] 
    }
  }

  return 'no found'
}

// 利用对象储存目标键值对   -- 执行时间 sum2: 0.213134765625 ms
function twoNumsSum(arr, target) {
  let obj = {}
  for (let i = 0; i < arr.length; i++) {
    if (obj[target - arr[i]] !== undefined) {
      return [obj[target - arr[i]], i]
    } 

    obj[arr[i]] = i
  }
}

console.log(twoNumsSum(arr, 9))    // 输出结果 [1, 3]

2、数组扁平化

let arr = [3, [7, 10], [2, [9, 1]], 4, [[[5, 11], 22], 15, 17], 14]
// 使用reduce + concat方式递归处理  -- 执行时间 flat1: 0.376953125 ms
function toFlat(arr) { 
  return arr.reduce((prev, next) => prev.concat(Array.isArray(next) ? toFlat(next) : next), [])
}

// 使用ES6规范   -- 执行时间 flat2: 0.14404296875 ms
function toFlat(arr) { 
  return arr.flat(Infinity)
}

// 利用数组的栈操作   -- 执行时间 flat3: 0.240966796875 ms
function toFlat(arr) { 
  let stack_a = [...arr]
  let stack_b = []

  while (stack_a.length) {
    const _tmp = stack_a.pop()
    Array.isArray(_tmp) ? stack_a.push(..._tmp) : stack_b.unshift(_tmp)
  }

  return stack_b
}

console.log(toFlat(arr))  //  输出结果 [3, 7, 10, 2, 9, 1, 4, 5, 11, 22, 15, 17, 14]