JS算法练习 11.13

leetcode 2625 扁平化嵌套数组

请你编写一个函数,它接收一个 多维数组 arr 和它的深度 n ,并返回该数组的 扁平化后的结果。

多维数组 是一种包含整数或其他 多维数组的递归数据结构。

数组 扁平化 是对数组的一种操作,定义是将原数组部分或全部子数组删除,并替换为该子数组中的实际元素。只有当嵌套的数组深度大于 n 时,才应该执行扁平化操作。第一层数组中元素的深度被认为是 0。

请在没有使用内置方法 Array.flat 的前提下解决这个问题。

示例 1:

复制代码
输入
arr = [1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]]
n = 0
输出
[1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]]

解释
传递深度 n=0 的多维数组将始终得到原始数组。这是因为 子数组(0) 的最小可能的深度不小于 n=0 。因此,任何子数组都不应该被平面化。

示例 2:

复制代码
输入
arr = [1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]]
n = 1
输出
[1, 2, 3, 4, 5, 6, 7, 8, [9, 10, 11], 12, 13, 14, 15]

解释
以 4 、7 和 13 开头的子数组都被扁平化了,这是因为它们的深度为 0 , 而 0 小于 1 。然而 [9,10,11] 其深度为 1 ,所以未被扁平化。

示例 3:

复制代码
输入
arr = [[1, 2, 3], [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]]
n = 2
输出
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

解释
所有子数组的最大深度都为 1 。因此,它们都被扁平化了。

两种方法,一种递归一种循环

递归↓(测试用例通过127/131 会超时)

javascript 复制代码
var flat = function (arr, n) {
    if(n == 0)return arr
    result = []
    for(let i = 0; i < arr.length; i ++){
        if(Array.isArray(arr[i])){
            result = result.concat(arr[i])
        }else{
            result.push(arr[i])
        }
    }
    return flat(result, n-1)
};

循环↓ 依旧超时,很无语。。

javascript 复制代码
var flat = function (arr, n) {
    while(n > 0){
        result = []
        for(let i = 0; i < arr.length; i ++){
            if(Array.isArray(arr[i])){
                result = result.concat(arr[i])
            }else{
                result.push(arr[i])
            }
        }
        arr = result
        n --
    }
    return arr
};

看题解吧,原来递归只递归子数组,而不是一整个重新递归。。学到了

javascript 复制代码
var flat = function (arr, n) {
    let res = [];
    const flattening = (nums, l) => {
      for (const num of nums) {
        if (Array.isArray(num) && l > 0) {
          flattening(num, l - 1);
        } else {
          res.push(num);
        }
      }
    }

    flattening(arr, n);
    return res;
};

leetcode 2626 数组归约运算

请你编写一个函数,它的参数为一个整数数组 nums 、一个计算函数 fn 和初始值init 。返回一个数组 归约后的值。

你可以定义一个数组 归约后 的值,然后应用以下操作: 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 。

就是非常无脑

javascript 复制代码
var reduce = function(nums, fn, init) {
    result = init
    for(let i = 0; i < nums.length; i ++){
        result = fn(result, nums[i])
    }
    return result
};

leetcode 2627 函数防抖

请你编写一个函数,接收参数为另一个函数和一个以毫秒为单位的时间 t ,并返回该函数的 函数防抖后的结果。

函数防抖 方法是一个函数,它的执行被延迟了 t 毫秒,如果在这个时间窗口内再次调用它,它的执行将被取消。你编写的防抖函数也应该接收传递的参数。

例如,假设 t = 50ms ,函数分别在 30ms60ms100ms 时调用。前两个函数调用将被取消,第三个函数调用将在 150ms 执行。如果改为 t = 35ms ,则第一个调用将被取消,第二个调用将在 95ms 执行,第三个调用将在 135ms 执行。

没啥好说的,老生常谈的问题,注意timer千万不能定义到return的函数内部

javascript 复制代码
var debounce = function(fn, t) {
    let timer
    return function(...args) {
        clearTimeout(timer)
        timer = setTimeout(() => {
            fn(...args)
        }, t)
    }
};
相关推荐
小茴香3537 分钟前
Vue 脚手架(Vue CLI)
前端·javascript·vue.js
午安~婉13 分钟前
ESLint
前端·eslint·检查
“抚琴”的人13 分钟前
C#中获取程序执行时间
服务器·前端·c#
掘金一周24 分钟前
Flex 布局下文字省略不生效?原因其实很简单| 掘金一周 10.16
前端
你的电影很有趣25 分钟前
lesson72:Node.js 安全实战:Crypto-Js 4.2.0 与 Express 加密体系构建指南
javascript·安全·node.js
Stringzhua29 分钟前
Vue的Axios介绍【9】
前端·javascript·vue.js
渣哥33 分钟前
从 READ_UNCOMMITTED 到 SERIALIZABLE:Spring 事务隔离级别全解析
javascript·后端·面试
云霄IT37 分钟前
绕过Frida检测反调试的一些办法
android·javascript
摸着石头过河的石头1 小时前
JavaScript 垃圾收集:内存管理的艺术
前端·javascript
前端小崽子1 小时前
🔥 踩坑实录:Fabric 在 Intel Iris Xe 显卡上 CPU 飙升 100%
前端