手写算法:两数之和

1. 两数之和open in new window

暴力法

function twoSum(nums, target) {
  const len = nums.length;
  let result = [];
  for (let i = 0; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
      if (nums[i] + nums[j] === target) {
        result.push(i, j);
        // 题目说,只会有一个答案,可以直接return出去,剩余的不用再走
        return result;
      }
    }
  }
}

对象, 用值作为 key,存储索引。

function twoSum(nums, target) {
  let obj = {};
  for (let i = 0; i < nums.length; i++) {
    const diff = target - nums[i];
    const diffIdx = obj[diff];

    if (diffIdx === undefined) {
      obj[nums[i]] = i;
    } else {
      return [diffIdx, i];
    }
  }
}

哈希表

function twoSum(nums, target) {
  let map = new Map();
  for (let i = 0; i < nums.length; i++) {
    const item = nums[i];
    if (map.has(item)) {
      return [map.get(item), i];
    } else {
      map.set(target - item, i);
    }
  }
}

手写题:实现 compose()

function compose() {}
const multiply20 = price => price * 20;
const divide100 = price => price / 100;
const normalizePrice = price => price.toFixed(2);
const discount = compose(normalizePrice, divide100, multiply20);
discount(200.0); //40.00

主要考的点是函数的链式调用,柯里化的实现

从里到外调用,一层一层的往外冒

function compose(...fns) {
  return fns.reduce((a, b) => {
    return function _fn(...args) {
      return a(b(...args));
    };
  });
}
Last Updated:
Contributors: kk