说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
题目描述
给定一个整数数组 nums、一个 reducer 函数 fn 和一个初始值 init,返回通过依次对数组的每个元素执行 fn 函数得到的最终结果。
通过以下操作实现这个结果:val = fn(init, nums[0]),val = fn(val, nums[1]),val = fn(val, nums[2]),… 直到处理数组中的每个元素。然后返回 val 的最终值。
如果数组的长度为 0,则函数应返回 init。
请你在不使用内置数组方法的 Array.reduce 前提下解决这个问题。
示例 1:
输入: nums = [1,2,3,4] fn = function sum(accum, curr) { return accum + curr; } init = 0 输出:10 解释: 初始值为 init=0 。 (0) + nums[0] = 1 (1) + nums[1] = 3 (3) + nums[2] = 6 (6) + nums[3] = 10 Val 最终值为 10。
示例 2:
输入: nums = [1,2,3,4] fn = function sum(accum, curr) { return accum + curr * curr; } init = 100 输出:130 解释: 初始值为 init=100 。 (100) + nums[0]^2 = 101 (101) + nums[1]^2 = 105 (105) + nums[2]^2 = 114 (114) + nums[3]^2 = 130 Val 最终值为 130。
示例3:
输入: nums = [] fn = function sum(accum, curr) { return 0; } init = 25 输出:25 解释:这是一个空数组,所以返回 init 。
提示:
- 0 <= nums.length <= 1000
- 0 <= nums[i] <= 1000
- 0 <= init <= 1000
解题思路
题目的意思其实就是要我们实现一个reduce
函数。
在函数中,首先对传入的参数进行校验:
- 如果 fn 不是一个函数,或者 nums 是空数组,则直接返回初始值 init。
- 否则,初始化结果变量 res 为初始值 init。
然后使用 for…of 循环遍历数组 nums,对每个元素调用归约函数 fn,并将返回值赋值给 res。
最后返回归约的结果 res。
实现了一个简单但实用的归约函数 reduce,可以方便地对数组进行求和、计数、查找等操作。
AC代码
/** * @param {number[]} nums * @param {Function} fn * @param {number} init * @return {number} */ var reduce = function (nums, fn, init) { if (typeof fn !== "function" || nums.length === 0) { return init; } let res = init; for (const num of nums) { res = fn(res, num); } return res; };
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。