剑指Offer——构建乘积数组(JS实现) |刷题打卡

简介: 剑指Offer——构建乘积数组(JS实现) |刷题打卡

前言

掘金团队号上线,助你 Offer 临门! 点击 查看详情

题目描述

image.png

解题思路

  • 遇到这道题,我首先使用使用双指针,左右遍历
  • 遇到第i个元素则停止遍历,然后进行求乘积
  • 但是结果超时
  • 最终通过对称遍历的方式成功解决问题

解题代码一:暴力双指针(超时)

var constructArr = function (a) {
    // 使用左右指针两边遍历的方法
    const result = [];
    let l = 0;
    let r = a.length - 1;
    let temp = 1;
    let temp2 = 1;
    for (let i = 0; i < a.length; i++) {
        while (l !== i) {
            temp = temp * a[l];
            l++;
        }
        while (r !== i) {
            temp2 = temp2 * a[r];
            r--;
        }
        l = 0;
        r = a.length - 1;
        result.push(temp * temp2)
        temp = 1;
        temp2 = 1;
    }
    return result;
};

超时原因

  • 涉及到多个循环,时间复杂度太高,必须改进时间复杂度。

解题代码二:使用截取除i个元素之外的所有元素(超时)

var constructArr = function (a) {
    const result = [];
    let testarr = [];
    let l = 0;
    let r = a.length - 1;
    let temp = 1;
    let temp2 = 1;
    for (let i = 0; i < a.length; i++) {
        testarr.push(...a.slice(0,i),...a.slice(i+1))
        result.push(testarr.reduce((pre,cur) => pre * cur,1));
        testarr = [];
    }
    return result;
};

超时原因

  • 还是时间复杂度太高。

解题代码三:使用对称遍历(成功AC)

var constructArr = function (a) {
    let right = [];
    let left = [];
    const result = [];
    for (let i = 0; i < a.length; i++) {
        if (i === 0) {
            left[i] = a[0];
            right[i] = a[a.length - 1];
        } else {
            left[i] = left[i-1] * a[i];
            right[i] = right[i-1] * a[a.length-1-i];
        }
    }
    for (let i = 0; i < a.length;i++) {
        if (i === a.length - 1) {
            result.push(left[left.length-2]);
            break;
        }
        if (i === 0) {
            result.push(right[right.length-2])
        } else {
            result.push(right[right.length-1-i-1] * left[i-1])
        }
    }
    return result;
};

总结

  • 本题乍一看不难,大家也都容易想到一定的思路,但是难就难在时间复杂度的问题上
  • 只有比较低的时间复杂度才能够通过
  • 本题给我们的启示就是对称遍历
  • 这里的对称遍历刚开始是包好第i个元素的,并不是说将第i个元素去掉,这是我思维上的误区,就是一直想在刚开始就将第i个元素去掉,实际上通过对称遍历,存储左边的数组和存储右边的数组,刚开始都是全部遍历完的,之后再从结果中去取我们想要的结果。
  • 路漫漫其修远兮,吾将上下而求索。加油!


相关文章
|
29天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js:从零开始构建后端服务
【10月更文挑战第42天】在数字时代的浪潮中,掌握一门后端技术对于开发者来说至关重要。Node.js,作为一种基于Chrome V8引擎的JavaScript运行环境,允许开发者使用JavaScript编写服务器端代码,极大地拓宽了前端开发者的技能边界。本文将从Node.js的基础概念讲起,逐步引导读者理解其事件驱动、非阻塞I/O模型的核心原理,并指导如何在实战中应用这些知识构建高效、可扩展的后端服务。通过深入浅出的方式,我们将一起探索Node.js的魅力和潜力,解锁更多可能。
|
25天前
|
JSON 缓存 JavaScript
深入浅出:使用Node.js构建RESTful API
在这个数字时代,API已成为软件开发的基石之一。本文旨在引导初学者通过Node.js和Express框架快速搭建一个功能完备的RESTful API。我们将从零开始,逐步深入,不仅涉及代码编写,还包括设计原则、最佳实践及调试技巧。无论你是初探后端开发,还是希望扩展你的技术栈,这篇文章都将是你的理想指南。
|
18天前
|
JSON JavaScript 前端开发
深入浅出Node.js:从零开始构建RESTful API
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将引导您步入Node.js的奇妙世界,通过实践操作,掌握如何使用这一强大的JavaScript运行时环境构建高效、可扩展的RESTful API。我们将一同探索Express框架的使用,学习如何设计API端点,处理数据请求,并实现身份验证机制,最终部署我们的成果到云服务器上。无论您是初学者还是有一定基础的开发者,这篇文章都将为您打开一扇通往后端开发深层知识的大门。
34 12
|
24天前
|
JavaScript NoSQL API
深入浅出Node.js:从零开始构建RESTful API
在数字化时代的浪潮中,后端开发如同一座灯塔,指引着数据的海洋。本文将带你航行在Node.js的海域,探索如何从一张白纸到完成一个功能完备的RESTful API。我们将一起学习如何搭建开发环境、设计API结构、处理数据请求与响应,以及实现数据库交互。准备好了吗?启航吧!
|
27天前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
40 5
|
26天前
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
1月前
|
JSON JavaScript API
深入浅出Node.js:从零开始构建RESTful API
【10月更文挑战第39天】 在数字化时代的浪潮中,API(应用程序编程接口)已成为连接不同软件应用的桥梁。本文将带领读者从零基础出发,逐步深入Node.js的世界,最终实现一个功能完备的RESTful API。通过实践,我们将探索如何利用Node.js的异步特性和强大的生态系统来构建高效、可扩展的服务。准备好迎接代码和概念的碰撞,一起解锁后端开发的新篇章。
|
28天前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API
使用JavaScript和Node.js构建简单的RESTful API
|
1月前
|
JavaScript 前端开发 NoSQL
深入浅出:使用Node.js构建RESTful API
【10月更文挑战第35天】在数字时代的浪潮中,后端技术如同海洋中稳固的灯塔,为前端应用提供数据和逻辑支撑。本文旨在通过浅显易懂的方式,带领读者了解如何利用Node.js这一强大的后端平台,搭建一个高效、可靠的RESTful API。我们将从基础概念入手,逐步深入到代码实践,最终实现一个简单的API示例。这不仅是对技术的探索,也是对知识传递方式的一次创新尝试。让我们一起启航,探索Node.js的奥秘,解锁后端开发的无限可能。
|
1月前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。