手写算法: 最大子数组和
思路
用动态规划来实现
sum 记录和,result 记录最大值;
当 sum > 0 时,对结果有增益效果,可以相加;
当 sum < 0 时,说明前面的数都为负数,可以全部舍去,从当前的这个开始相加;
最后 sum 与 result 相比,谁大取谁;
/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
let result = nums[0];
let sum = 0;
for (let i = 0; i < nums.length; i++) {
if (sum > 0) {
sum += nums[i];
} else {
sum = nums[i];
}
result = Math.max(sum, result);
}
return result;
};
手写题:实现 async helper - parallel()
解法一
/**
* @param {AsyncFunc[]} funcs
* @return {(callback: Callback) => void}
*/
function parallel(funcs) {
return function(callback, data) {
let result = [],
isError = false;
funcs.forEach((func, index) => {
func((error, data) => {
if (isError) return;
if (error) {
isError = true;
callback(error, undefined);
}
result[index] = data;
if (Object.keys(result).length === funcs.length) {
callback(undefined, result);
}
}, data);
});
};
}
解法二
/**
* @param {AsyncFunc[]} funcs
* @return {(callback: Callback) => void}
*/
function parallel(funcs) {
// your code here
return (callback, data) => {
Promise.all(funcs.map(fn => parallelify(fn, data)))
.then(outputs => callback(undefined, outputs))
.catch(error => callback(error, undefined));
};
}
function parallelify(fn, input) {
return new Promise((resolve, reject) => {
fn((error, data) => (error ? reject(error) : resolve(data)), input);
});
}