”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Typescript 编码编年史:除 Self 之外的数组的乘积

Typescript 编码编年史:除 Self 之外的数组的乘积

发布于2024-07-31
浏览:940

Typescript Coding Chronicles: Product of Array Except Self

问题陈述:

给定一个整数数组nums,返回一个数组answer,使得answer[i]等于除nums[i]之外的nums所有元素的乘积。

nums 的任何前缀或后缀的乘积保证适合 32 位整数。

您必须编写一个在 O(n) 时间内运行且不使用除法运算的算法。

示例1:

  • 输入:nums = [1,2,3,4]
  • 输出:[24,12,8,6]

示例2:

  • 输入:nums = [-1,1,0,-3,3]
  • 输出:[0,0,9,0,0]

限制条件:

  • 2
  • -30
  • nums 的任何前缀或后缀的乘积保证适合 32 位整数。

跟进:

你能以 O(1) 额外的空间复杂度解决这个问题吗? (输出数组不计为空间复杂度分析的额外空间。)

初步思考过程:

为了解决这个问题,我们需要计算除当前元素之外的所有元素的乘积,而不使用除法运算。这可以通过对数组使用两次传递来完成:

  1. 计算每个元素的前缀积。
  2. 计算每个元素的后缀乘积并与前缀乘积相乘。

基本解决方案:

我们可以用两个数组来存储前缀和后缀的乘积,然后将它们相乘得到最终的结果。

代码:

function productExceptSelf(nums: number[]): number[] {
    const n = nums.length;
    const prefixProducts = new Array(n).fill(1);
    const suffixProducts = new Array(n).fill(1);
    const result = new Array(n).fill(1);

    // Compute prefix products
    for (let i = 1; i = 0; i--) {
        suffixProducts[i] = suffixProducts[i   1] * nums[i   1];
    }

    // Compute the result by multiplying prefix and suffix products
    for (let i = 0; i 



时间复杂度分析:

  • 时间复杂度: O(n),其中n是数组的长度。我们迭代数组三次。
  • 空间复杂度: O(n),用于存储前后缀乘积。

限制:

基本解决方案效果很好,但使用额外的空间来存储前缀和后缀产品。

优化方案:

我们可以优化解决方案以使用 O(1) 额外空间,方法是使用输出数组首先存储前缀产品,然后就地修改它以包含后缀产品。

代码:

function productExceptSelfOptimized(nums: number[]): number[] {
    const n = nums.length;
    const result = new Array(n).fill(1);

    // Compute prefix products in the result array
    for (let i = 1; i = 0; i--) {
        result[i] = result[i] * suffixProduct;
        suffixProduct *= nums[i];
    }

    return result;
}

时间复杂度分析:

  • 时间复杂度: O(n),其中n是数组的长度。我们迭代数组两次。
  • 空间复杂度: O(1),因为我们使用输出数组来存储中间结果并且不使用任何额外的空间。

基本解决方案的改进:

  • 优化后的解决方案通过使用中间结果的输出数组将空间复杂度降低到 O(1)。

边缘情况和测试:

边缘情况:

  1. 数组包含零。
  2. 数组包含负数。
  3. 数组长度为最小 (2) 或最大 (10^5) 限制。

测试用例:

console.log(productExceptSelf([1,2,3,4])); // [24,12,8,6]
console.log(productExceptSelf([-1,1,0,-3,3])); // [0,0,9,0,0]
console.log(productExceptSelf([2,2,2,2])); // [8,8,8,8]
console.log(productExceptSelf([0,0])); // [0,0]
console.log(productExceptSelf([5])); // This should not be a valid input as the minimum length is 2
console.log(productExceptSelf([1,2])); // [2, 1]

console.log(productExceptSelfOptimized([1,2,3,4])); // [24,12,8,6]
console.log(productExceptSelfOptimized([-1,1,0,-3,3])); // [0,0,9,0,0]
console.log(productExceptSelfOptimized([2,2,2,2])); // [8,8,8,8]
console.log(productExceptSelfOptimized([0,0])); // [0,0]
console.log(productExceptSelfOptimized([5])); // This should not be a valid input as the minimum length is 2
console.log(productExceptSelfOptimized([1,2])); // [2, 1]

一般解决问题的策略:

  1. 理解问题:仔细阅读问题陈述,了解需求和约束。
  2. 识别关键操作:确定需要的关键操作,例如计算前缀和后缀乘积。
  3. 优化可读性:使用清晰简洁的逻辑,确保代码易于理解。
  4. 彻底测试:使用各种情况(包括边缘情况)测试解决方案,以确保正确性。

识别类似问题:

  1. 前缀和数组:

    • 需要计算范围查询的前缀和的问题。
    • 示例:范围求和查询。
  2. 就地算法:

    • 需要在有限的额外空间内进行操作的问题。
    • 示例:将数组向右旋转 k 步。
  3. 数组操作:

    • 需要根据具体情况修改数组的问题。
    • 示例:将零移至数组末尾。

结论:

  • 使用额外空间的基本方法和优化的就地方法可以有效地解决计算除 self 之外的数组的乘积的问题。
  • 理解问题并将其分解为可管理的部分至关重要。
  • 使用清晰的逻辑并优化可读性可确保解决方案易于理解。
  • 使用各种边缘情况进行测试可确保稳健性。
  • 认识问题的模式可以帮助将类似的解决方案应用于其他挑战。

通过练习这些问题和策略,您可以提高解决问题的能力,并为各种编码挑战做好更好的准备。

版本声明 本文转载于:https://dev.to/__zamora__/typescript-coding-chronicles-product-of-array-except-self-3gg4?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • SSMS中T-SQL调试时如何查看表变量值?
    SSMS中T-SQL调试时如何查看表变量值?
    在调试期间查看表变量值在 SQL Server Management Studio (SSMS) 中调试 Transact-SQL (T-SQL) 代码时,检查存储在表变量中的值会很有帮助。然而,标准调试工具并没有提供直接查看表变量内容的方法。解决方案:将表变量转换为 XML此问题的简单解决方案包括...
    编程 发布于2024-12-21
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-12-21
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-12-21
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    编程 发布于2024-12-21
  • 为什么我的 PHP 脚本抛出“无法加载动态库”警告?
    为什么我的 PHP 脚本抛出“无法加载动态库”警告?
    疑难解答:PHP警告“无法加载动态库”执行PHP脚本时,可能会遇到以下错误:PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-2009062...
    编程 发布于2024-12-21
  • 如何使用 Eloquent 或查询生成器将多行插入数据库?
    如何使用 Eloquent 或查询生成器将多行插入数据库?
    使用 Eloquent 或 Fluent 同时插入多行此查询探讨了如何使用 Eloquent 中的单个查询将多行插入数据库(或流畅的)框架。给定的示例使用 UserSubject::where('user_id', Auth::id())->select('subject_i...
    编程 发布于2024-12-21
  • 如何在 Retrofit 中使用自定义 Gson 转换器高效提取嵌套 JSON 数据?
    如何在 Retrofit 中使用自定义 Gson 转换器高效提取嵌套 JSON 数据?
    在 Retrofit 中使用自定义 Gson 转换器提取嵌套 JSON许多 API 提供具有通用 JSON 结构的响应,其中根对象包含嵌套对象包含所需数据的“内容”字段。然而,大多数 POJO 只对“内容”字段中的数据进行建模,使得改造类型适配器无法提取并返回适当的对象。为了解决这个问题,可以开发一...
    编程 发布于2024-12-21
  • 如何使用 PHP 将字符串中的普通 URL 转换为可点击的超链接?
    如何使用 PHP 将字符串中的普通 URL 转换为可点击的超链接?
    使用 PHP 链接字符串中的 URL在 PHP 中,链接字符串中的 URL 可能是一项有用的任务,例如在文本中生成可点击链接等任务内容。一种常见的用例是将包含 URL 的纯字符串转换为具有可点击超链接的 HTML。语法:$string = preg_replace( "~[[:alph...
    编程 发布于2024-12-21
  • 为什么在 C 语言中从字符中减去“0”会显示其数值?
    为什么在 C 语言中从字符中减去“0”会显示其数值?
    解码字符值:为什么减去“0”会泄露数字表示出现一个令人费解的问题:为什么从a中减去“0” C 中的字符揭示了它所代表的数值?为了解开这个谜团,让我们深入研究一下ASCII(美国信息交换标准代码)领域,它为每个字符分配数字代码。 '0' 保留此数字序列中的第一个位置,后续字符逐渐分配更...
    编程 发布于2024-12-21
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-12-21
  • 如何启用和禁用MySQL查询审计一小时?
    如何启用和禁用MySQL查询审计一小时?
    在 MySQL 中启用查询审核如果您希望监控并记录在 MySQL 数据库上执行的所有查询一个小时,您可以可以打开审核日志记录。审核日志记录配置启用审核日志记录和转储将日志写入文件,请在 MySQL 控制台中执行以下命令:SET global log_output = 'FILE'; SET glob...
    编程 发布于2024-12-21
  • 如何使用 JavaScript 创建可悬停的选择框选项?
    如何使用 JavaScript 创建可悬停的选择框选项?
    可悬停选择框选项当前的问题涉及创建一个选择框,当将字段悬停在该选择框上时,选项说明可见,而不是单击打开options.实现为了实现此功能,我们利用了 JavaScript 方法:如下:$('#selectUl li:not(":first")').addClass('unsele...
    编程 发布于2024-12-21
  • 解析 JSON 数据时如何解决“TypeError:字符串索引必须是整数”?
    解析 JSON 数据时如何解决“TypeError:字符串索引必须是整数”?
    避免“TypeError:字符串索引必须是整数”当尝试将 JSON 文件中的数据转换为可理解的 CSV 格式时,您可能会遇到“TypeError:字符串索引必须是整数”错误。当像字典一样访问字符串的字段时,会出现此错误。让我们探索解决方案。理解错误要理解该错误,需要注意的是,Python 中的字符串...
    编程 发布于2024-12-21
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-12-21
  • 如何使用 jQuery 禁用和启用输入字段?
    如何使用 jQuery 禁用和启用输入字段?
    使用 jQuery 禁用和启用输入字段使用 HTML 表单元素时,通常需要为用户禁用或启用某些输入字段相互作用。 jQuery 提供了多种方法来完成这些任务。禁用输入字段在 jQuery 版本 1.6 及更高版本中禁用输入字段的首选方法是通过 prop( ) function:$("inp...
    编程 发布于2024-12-21

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3