leetcode — JavaScript专题(五):计数器 II、只允许一次函数调用、 创建 Hello World 函数、将对象数组转换为矩阵、节流、分块数组

这篇具有很好参考价值的文章主要介绍了leetcode — JavaScript专题(五):计数器 II、只允许一次函数调用、 创建 Hello World 函数、将对象数组转换为矩阵、节流、分块数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

专栏声明:只求用最简单的,容易理解的方法通过,不求优化,不喜勿喷

2665. 计数器 II

题面

请你写一个函数 createCounter. 这个函数接收一个初始的整数值 init 并返回一个包含三个函数的对象。

这三个函数是:

increment() 将当前值加 1 并返回。
decrement() 将当前值减 1 并返回。
reset() 将当前值设置为 init 并返回。

知识点:

闭包

思路

编写一个闭包保存我们的变量的当前数值,之后对于不同的操作对这个数据进行增减即可,注意 init 作为我们传入的数值,也可以作为一个闭包中可以获取和操作的数值

代码
var createCounter = function(init) {
     var now = init;
     let increment = () => {
         return ++now;
     }
     let decrement = () => {
         return --now;
     }
     let reset = () => {
         return now = init;
     }
     return {increment,decrement,reset }
};

/**
 * const counter = createCounter(5)
 * counter.increment(); // 6
 * counter.reset(); // 5
 * counter.decrement(); // 4
 */

2666. 只允许一次函数调用

题面

给定一个函数 fn ,它返回一个新的函数,返回的函数与原始函数完全相同,只不过它确保 fn 最多被调用一次。

第一次调用返回的函数时,它应该返回与 fn 相同的结果。
第一次后的每次调用,它应该返回 undefined 。

知识点:

闭包

思路

我们设定一个变量标识这个函数是不是运行过了,之后每次调用的时候判定,如果调用过了就返回 undefined ,否则返回函数的执行结果即可

代码
var once = function(fn) {

    var first = 0;
    return function(...args){
        if(first == 0){
              first++;
            return fn(...args)
        }else{
            return undefined
        }
    }
};

2667. 创建 Hello World 函数

题面

请你编写一个名为 createHelloWorld 的函数。它应该返回一个新的函数,该函数总是返回 “Hello World” 。

知识点:

思路

返回 “Hello World” 即可,纯弱智

代码
var createHelloWorld = function() {
    return function(...args) {
        return "Hello World";
    }
};

/**
 * const f = createHelloWorld();
 * f(); // "Hello World"
 */

2675. 将对象数组转换为矩阵

题面

编写一个函数,将对象数组 arr 转换为矩阵 m 。

arr 是一个由对象组成的数组或一个数组。数组中的每个项都可以包含深层嵌套的子数组和子对象。它还可以包含数字、字符串、布尔值和空值。

矩阵 m 的第一行应该是列名。如果没有嵌套,列名是对象中的唯一键。如果存在嵌套,列名是对象中相应路径,以点号 “.” 分隔。

剩余的每一行对应 arr 中的一个对象。矩阵中的每个值对应对象中的一个值。如果给定对象在给定列中没有值,则应该包含空字符串 “” 。

矩阵中的列应按 字典升序 排列。

知识点:

深度优先遍历、set、哈希表

思路

dfs递归遍历给出的对象,用一个 path 数组保存已经经过的路径,方便生成 key

  • 如果遇到的是基础类型,直接把 key 和 value 进行保存
  • 如果是数组类型,对数组的每一项进行dfs 遍历,并将 index 放入路径参数中
  • 如果是对象类型,对对象的每个 key 进行 dfs 遍历,并将 key 放入路径参数中
    遍历完成后,遍历每一行的 map,获取所有的 key 的信息,之后重新遍历我们每一行的map,对每个 key 获取信息,生成我们需要的结果返回即可
代码
type Value = string | number | boolean | null

function jsonToMatrix(arr: any[]): Value[][] {
  const rows: Map<string, Value>[] = []

  arr.forEach(item => {
    const rowMap = new Map<string, Value>()
    dfs(item, [], rowMap)
    rows.push(rowMap)
  })

  const allKey = new Set<string>()
  rows.forEach(mp => {
    for (const key of mp.keys()) {
      allKey.add(key)
    }
  })
  const row0 = [...allKey].sort()

  const res: Value[][] = Array(arr.length + 1)
  res[0] = row0
  for (let i = 1; i < res.length; i++) {
    res[i] = Array(allKey.size).fill('')
    for (let j = 0; j < row0.length; j++) {
      const mp = rows[i - 1]
      if (mp.has(row0[j])) {
        res[i][j] = mp.get(row0[j])!
      }
    }
  }
  return res

  function dfs(obj: any, path: string[], rowMap: Map<string, Value>): void {
    if (!isObject(obj)) {
      const key = path.join('.')
      rowMap.set(key, obj)
      return
    }

    if (Array.isArray(obj)) {
      obj.forEach((item, index) => {
        path.push(String(index))
        dfs(item, path, rowMap)
        path.pop()
      })
    }

    Object.entries(obj).forEach(([key, val]) => {
      path.push(key)
      dfs(val, path, rowMap)
      path.pop()
    })
  }
}

function isObject(val: unknown): val is object {
  return typeof val === 'object' && val !== null
}

2676. 节流

题面

现给定一个函数 fn 和一个以毫秒为单位的时间 t ,请你返回该函数的 节流 版本。

节流 函数首先立即被调用,然后在 t 毫秒的时间间隔内不能再次执行,但应该存储最新的函数参数,以便在延迟结束后使用这些参数调用 fn 。

知识点:

节流

思路

我们设定一个变量记录我们上一轮的运行的时间,每当我们有新的任务调用时,如果它已经比上一轮调用晚了 t 时间以上,我们直接运行这个任务,然后记录当前时间为上一轮运行时间;
如果我们当前任务还不能执行,我们通过上一轮执行时间和当前时间的差以及 t 的值算出它需要推迟多久,开始一个计数器,在这段时间后执行我们的函数,我们保存这个计时器,方便我们取消;
每次开始计时器的时候,我们要取消已经存在的计时器,也就是取消上一次的任务,以便于每次都能执行最新的任务。

代码
var throttle = function (fn, t) {
    let timer = null;
    let mt = 0;
    return function (...args) {
        let now = Date.now();
        if (now - mt > t) {
            mt = now;
            fn(...args)
        }else{
            clearTimeout(timer);
            timer = setTimeout(() => {
                mt += t ;
                fn(...args)
            },  t - now + mt)
        }
    }
};

/**
 * const throttled = throttle(console.log, 100);
 * throttled("log"); // logged immediately.
 * throttled("log"); // logged at t=100ms.
 */

2677. 分块数组

题面

给定一个数组 arr 和一个块大小 size ,返回一个 分块 的数组。分块 的数组包含了 arr 中的原始元素,但是每个子数组的长度都是 size 。如果 arr.length 不能被 size 整除,那么最后一个子数组的长度可能小于 size 。

你可以假设该数组是 JSON.parse 的输出结果。换句话说,它是有效的JSON。

请你在不使用 lodash 的函数 _.chunk 的情况下解决这个问题。

知识点:

数组

思路

遍历原数组,将元素依次放入临时数组中,到达指定长度就将临时数组放进我们的结果数组并且清空临时数组,最后把剩下的元素(如果还有的话)一起放入结果数组,返回结果即可文章来源地址https://www.toymoban.com/news/detail-774878.html

代码
var chunk = function(arr, size) {
    let re = [ ];
    let t = [];
    for(var i = 0;i< arr.length;i++){
        if(t.length == size){
            re.push([...t]);
            t = [];
        }
        t.push(arr[i]);
    }
    if(t.length != 0){
        re.push([...t]);
    }
    return re;
};

到了这里,关于leetcode — JavaScript专题(五):计数器 II、只允许一次函数调用、 创建 Hello World 函数、将对象数组转换为矩阵、节流、分块数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)

    2023.5.12 编写一个十六进制计数器模块,计数器输出信号递增每次到达0,给出指示信号 zero ,当置位信号 set 有效时,将当前输出置为输入的数值 set_num 。 注意 :这里zero=1和num=0是同一拍输出的,按道理如果根据num=0,然后去输出zero=1应该延迟一拍。所以这里考虑将number延迟一

    2024年02月07日
    浏览(54)
  • LR中监控ORACLE数据库常用计数器(如何自定义Oracle计数器)

    目录 一、添加自定义计数器的方法 1、要创建自定义查询,请执行以下操作: 2、配置文件示例对象 二、常用自定义计数器列表 三、LR中监控ORACLE数据库常用计数器遇到问题及处理 1. 在安装路径的Mercury LoadRunnerdatmonitors找到vmon.cfg文件,打开。 2. 在vmon.cfg文件的第三行中,

    2024年02月15日
    浏览(53)
  • 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器与分频器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用

    2024年02月02日
    浏览(62)
  • 用74LS73设计四位二进制加法计数器和8421BCD加法计数器

     (1)用2片74LS73实现该电路,由CP端输入单脉冲,设计并画出4位异步二进制加法计数器电路图。  (2)由CP端输入单脉冲,测试并记录Q1~Q4端状态及波形。 四位二进制加法计数器状态迁移表如下: Q 4n Q 3n Q 2n Q 1n Q 4n+1 Q 3n+1 Q 2n+1 Q 1n+1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0

    2024年02月10日
    浏览(90)
  • 定时器/计数器中定时/计数初值的计算

             寄存器TMOD是单片机的一个特殊功能寄存器,其功能是控制定时器/计数器T0、T1的工作方式。它的字节地址为89H, 不可以对它进行位操作。          只能进行字节操作, 即给寄存器整体赋值的方法 设置初始值 ,如 TMOD=0x01 。在上电和复位时,寄存器TMOD的初始

    2024年02月10日
    浏览(50)
  • 数电:计数器

    同步计数器和异步计数器的区别 1.同步计数器的外部时钟端都连在一起,而异步计数器没有 2.同步计数器在外部信号到来时触发器同时翻转,而异步计数器的触发器为串行连接,工作频率较低 3.异步计数器输出状态的建立,要比CP慢一个传输时间,容易存在竞争冒险 竞争冒险

    2024年02月06日
    浏览(46)
  • 【时序逻辑电路】——计数器

    🦄🦄欢迎大家来学习数字电路——时序逻辑电路。 🦄🦄在这里我们会讲解二进制计数器、十进制计数器和集成计数器74LS161,希望通过我们的学习会让你更明白数字电路中的奥秘。 目录 🔑一、计数器  🏆1.二进制计数器  (1)异步二进制加法计数器 (2)同步二进制加法

    2024年02月02日
    浏览(59)
  • Linux性能计数器

      性能计数器是在大多数现代cpu上可用的特殊硬件寄存器。这些寄存器统计特定类型的hw事件的数量:例如执行的指令、遭受的cachemisses或错误预测的分支,而不会减慢内核或应用程序的速度。这些寄存器还可以在事件数量达到阈值时触发中断——因此可以用于分析在该CP

    2024年02月11日
    浏览(64)
  • verilog计数器

    (1) 深入了解计数器原理 (2) 学习使用 Verilog 实现同步计数器 ( 模八) 计数器的功能是记忆脉冲个数,它是数字系统中应用最为广泛的时序逻辑构件。 下图为设计 计数器从0开始每隔25_000_000个时钟周期(0.25秒)数码管末位显示加一,最大值为7,7后复0值              这

    2024年02月05日
    浏览(62)
  • 实验四 计数器

    五、实验步骤与实验结果 1、用Verilog VHDL设计D触发器。打开QuarterII新建一个基于ALTERA的Cyclone系列FPGA芯片EP1C3T144C8N的项目保存在D:dianluecp1文件夹中,新建一个Verilog HDL文件,将附件一代码写入,运行无错误,查看My74161计数器的逻辑图(图1-1),重新运行,无误后,进行“Creat sy

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包