手写算法:两数之和
暴力法
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));
};
});
}