当前位置: 首页 > news >正文

网站建设及编辑岗位职责网站做查赚钱

网站建设及编辑岗位职责,网站做查赚钱,wordpress邮箱qq接入,seo搜索引擎优化网站【力扣】2626. 数组归约运算——认识循环 文章目录 【力扣】2626. 数组归约运算——认识循环题目解决方案综述Reduce 的用途求和数组中的值按键索引数组结合 Filter 和 Map内置 Array.reduce 方法 1:使用 For...of 循环方法 2:使用 Array.forEach 循环方…

【力扣】2626. 数组归约运算——认识循环

文章目录

  • 【力扣】2626. 数组归约运算——认识循环
    • 题目
    • 解决方案
      • 综述
        • Reduce 的用途
        • 求和数组中的值
        • 按键索引数组
        • 结合 Filter 和 Map
        • 内置 Array.reduce
      • 方法 1:使用 For...of 循环
      • 方法 2:使用 Array.forEach 循环
      • 方法 3:使用 For...in 循环
      • 复杂度分析

题目

给定一个整数数组 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

解决方案

综述

本问题要求你编写一个基于 回调 函数的输出执行缩减变换的函数。除了mapfilter之外,它是 JavaScript 中最常用和重要的函数之一。

首先,建议你阅读关于mapfilter的内容,因为它们当中包含了相关的讨论。

Reduce 的用途

Reduce 遍历数组中的每个值,并以某种方式将每个值合并到一个累加器变量中。第一个参数是一个回调函数,它接受当前的accumulator 值和每个数组元素,并返回一个新的accumulator值。第二个参数是accumulator的初始值。在遍历整个数组后,将返回accumulator的最终值。

这是一个简单的操作,但在可以执行的转换类型上非常多样。在 Array.mapArray.filter无法解决问题时你可以将其用于几乎所有数组迭代。

以下示例使用内置的Array.reduce方法。

求和数组中的值

Reduce 的经典用例是将数组中的所有值相加。

const nums = [1, 2, 3];
const sum = nums.reduce((accumulator, val) => accumulator + val, 0);
console.log(sum); // 6

你还可以基于某个属性对值求和,稍作修改即可。

const nums = [{x: 1}, {x: 2}, {x: 3}];
const sum = nums.reduce((accumulator, val) => accumulator + val.x, 0);
console.log(sum); // 6
按键索引数组

在编程中非常常见的任务形式是将一组数据按某个键进行索引。这样,可以通过 O(1) 的时间复杂度访问数据的键。

const groceries = [{ id: 173, name: "Soup" }, { id: 964, name: "Apple" },{ id: 535, name: "Cheese" }
];const indexedGroceries = groceries.reduce((accumulator, val) => {accumulator[val.id] = val;return accumulator;
}, {});console.log(indexedGroceries);
/*** {*   "173": { id: 173, name: "Soup" },*   "964": { id: 964, name: "Apple" },*   "535": { id: 535, name: "Cheese" },* }*/

请注意,开发人员常犯的一个性能错误是在每次数组迭代时创建累加器的克隆,即 return { ...accumulator, [val.id]: val };。这将导致该算法的复杂度为 O(n2)。

结合 Filter 和 Map

有时候需要将 .filter().map()链接在一起,以删除数组中的元素并进行转换。问题在于这种方法效率较低,因为这种数组方法会在只需要一个数组的情况下创建两个数组。
你可以将 filter 和 map 合并为单个 reduce,以提高性能。

const groceries = [{ id: 173, name: "Soup" }, { id: 964, name: "Apple" },{ id: 535, name: "Cheese" }
];/** 使用 filter 和 map */
var names = groceries.filter(item => item.id > 500).map(item => item.name)/** 使用 reduce */
var names = groceries.reduce((accumulator, val) => {if (val.id > 500) {accumulator.push(val.name);}return accumulator;
}, []);console.log(names); // ["Apple", "Cheese"]
内置 Array.reduce

这个问题要求你重新实现Array.reduce方法,它是 JavaScript 中最常用的数组方法之一。但是,你的实现会与标准库有四个小差异。

  1. Array.reduce 是数组原型上的方法。这个实现是一个函数,接受数组作为第一个参数。
  2. 传递给 Array.reduce 的回调函数接受额外的两个参数。第三个参数是数组的 currentIndex。第四个参数是对原始数组的引用。
  3. Array.reduce 可选地允许你不传递initialValue 作为第二个参数。如果数组中没有元素,将会抛出一个错误。否则,initialValue将被视为数组中的第一个元素,并从索引 1 开始迭代。
  4. Array.reduce 处理稀疏数组。例如,如果你编写代码 let arr = Array(100); arr[1] = 10;Array.reduce 将只会查看索引 1,并会忽略空索引。这相当于在调用reduce()之前过滤掉所有空值。

方法 1:使用 For…of 循环

JavaScript 具有简单的语法,允许你遍历 可迭代 对象的每个元素。SetMap String 都是可迭代对象的示例。

var reduce = function(arr, fn, initialVal) {let accumulator = initialVal;for (const element of arr) {accumulator = fn(accumulator, element);}return accumulator;
};

方法 2:使用 Array.forEach 循环

JavaScript 数组具有用于遍历每个元素的内置方法。通常之所以优先选择它而不是普通的for循环,是因为它将实际值作为回调的第一个参数提供给回调函数,从而可能节省一行代码。

var reduce = function(arr, fn, initialVal) {let accumulator = initialVal;arr.forEach((element) => {accumulator = fn(accumulator, element);});return accumulator;
};

方法 3:使用 For…in 循环

For...in 循环更常用于遍历对象的键。但是,它们也可以用于遍历数组的索引。这种方法的显著特点是,它通过忽略空索引来考虑稀疏数组。例如,如果你编写了 let arr = Array(100); arr[1] = 10;,这种方法会将数组视为只有一个元素。

var reduce = function(arr, fn, initialVal) {let accumulator = initialVal;for (const index in arr) {accumulator = fn(accumulator, arr[index]);} return accumulator;
};

复杂度分析

以下分析适用于所有这些方法。假设 N 是输入数组的长度。

时间复杂度:O(N)。算法会遍历所有元素。
空间复杂度取决于提供的回调函数。例如,对数组中的元素求和是空间复杂度为 O(1) 的操作。而在最坏的情况下,过滤数组的空间复杂度为 O(N)。

http://www.dtcms.com/a/449489.html

相关文章:

  • 开源革命下的研发突围:Meta Llama系列模型的知识整合实践与启示
  • 做的网站怎样更新排名优化网站seo排名
  • 鸿蒙NEXT网络通信实战:使用HTTP协议进行网络请求
  • FastApi项目启动失败 got an unexpected keyword argument ‘loop_factory‘
  • 杭州有专业做网站的吗用.net做购物网站
  • 什么是 mesh 组网
  • 网站建设什么行业创建个人网站教案
  • 十五、深入理解 SELinux
  • 10.6作业
  • 《投资-70》投资、投机、赌博的比较,一个靠企业内在的价值增值、一个靠市场的价格波动、一个全靠随机性的运气。
  • 前端知识详解——HTML/CSS/Javascript/ES5+/Typescript篇/算法篇
  • 【MySQL】 索引特性详解
  • FreeRTOS实现微秒级时间同步(基于1588V2)
  • 网站基本要素网站建设 主要学是么
  • Java包的命名,常见的包类,如何导入包
  • 滑动窗口题目:替换后的最长重复字符
  • 谷歌seo建站成都不能去的建筑设计公司
  • 贵阳网站制作企业陕西省建设网三类人员证书打印
  • 【小沐学WebGIS】基于Three.JS绘制飞行轨迹Flight Tracker(Three.JS/ vue / react / WebGL)
  • 告别 v-model 焦虑:在 React 中优雅地处理『双向绑定』
  • vue生态都有哪些?
  • C++之类与对象
  • 东莞长安做网站wordpress创意主题店铺
  • 百度地图收藏地址提取与格式转换工具 说明文档
  • 操作系统应用开发(二十三)RustDesk ng反向代理—东方仙盟筑基期
  • 河北省建设厅网站查询中心郑州建站系统费用
  • 分布式系统设计模式:从理论到实践
  • 新零售升维体验商业模式创新研究:基于开源AI大模型、AI智能名片与S2B2C商城小程序的融合实践
  • 【Linux】系统部分——线程安全与线程的单例模式
  • 关键词查询爱站网石家庄新闻头条新闻最新今天