每日两题 T20

算法

LeetCode T22. 括号生成[1]

描述

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例

输入:n = 3
输出:[
       "((()))",
       "(()())",
       "(())()",
       "()(())",
       "()()()"
     ]

分析

看到这种符合某种规律,但又有区别的算法问题,自然想到递归的解法。当然我们也知道递归解法是可以转化为栈+循环的解法的。

观察可得:

1.某一次递归终止时需要将当前字符存入数组2.字符任取一个位置左侧必为左括号 >= 右括号3.每次递归除了需要传当前字符还需要记清当前左右括号数

代码

var generateParenthesis = function (n) {
  let res = [];
  //  cur :当前字符  left:当前字符左括号 right:当前字符右括号
  const help = (cur, left, right) => {
    if (cur.length === 2 * n) {
      res.push(cur);
      return;
    }
    if (left < n) {
      help(cur + "(", left + 1, right)
    }
    if (right < left) {
      help(cur + ")", left, right + 1);
    }
  };
  help("", 0, 0);
  return res;
};

前端

改造下面的代码,使之输出0 - 9

for (var i = 0; i< 10; i++){
   setTimeout((i) => {
           console.log(i);
   }, 1000,i)
}

分析

主要考察对于变量作用域的理解,解决变量作用域即可。

方法一

•利用 setTimeout 函数的第三个参数,会作为回调函数的第一个参数传入•利用 bind 函数部分执行的特性

for (var i = 0; i < 10; i++) {
  setTimeout(i => {
    console.log(i);
  }, 1000, i)
}

或者

for (var i = 0; i < 10; i++) {
  setTimeout(console.log, 1000, i)
}

或者

for (var i = 0; i < 10; i++) {
  setTimeout(console.log.bind(null, i), 1000)
}

方法二

利用 let 变量的特性 — 在每一次 for 循环的过程中,let 声明的变量会在当前的块级作用域里面(for 循环的 body 体,也即两个花括号之间的内容区域)创建一个文法环境(Lexical Environment),该环境里面包括了当前 for 循环过程中的 i

for (let i = 0; i < 10; i++) {
  setTimeout(() => {
    console.log(i);
  }, 1000)
}

方法三

利用函数自执行的方式,把当前 for 循环过程中的 i 传递进去,构建出块级作用域。

for (var i = 0; i < 10; i++) {
  (i => {
    setTimeout(() => {
      console.log(i);
    }, 1000)
  })(i)
}

方法四

纯属娱乐,利用 new Function 或者 eval

for (var i = 0; i < 10; i++) {
  setTimeout(new Function('console.log(i)')(), 1000)
}

References

[1] 22. 括号生成: https://leetcode-cn.com/problems/generate-parentheses/

本文分享自微信公众号 - JavaScript全栈(gh_0a40552e913e),作者:合一

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 每日两题 T7

    •1 <= deck.length <= 10000•0 <= deck[i] < 10000

    合一大师
  • 每日两题 T37

    一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

    合一大师
  • 每日两题 T32

    硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)

    合一大师
  • 【Python 第35课】 continue

    break是彻底地跳出循环,而continue只是略过本次循环的余下内容,直接进入下一次循环。 在我们前面写的那个统计分数的程序里,如果发现有成绩不足60分,...

    Crossin先生
  • 树莓派nodejs,mongodb

    由于目前mongodb是2.4,因此安装nodejs mongodb驱动只能安装2.2.35版本的

    战神伽罗
  • 人民广场怎么走?地铁换乘算法的实现

    现在的公共交通越来越方便,很多城市都有地铁,日常使用的地图App都提供了地铁线路换乘方案的功能,只要输入起点和重点,App就能给出你换乘的方案,可是这个功能背后...

    芋道源码
  • 字符串排序---字典序

    本周我们分享一个获取全排列的算法。这道题当时也是花了蛮久的时间才跟着题解写出来!小白经历了这道题目的“煎熬”之后,就为大家保驾护航,一起轻松拿下此题吧!

    鹏-程-万-里
  • HDU 1215 七夕节

    这都TLE了,不应该啊,难道是sqrt()的time complex的问题? 然后找了找sqrt()的源码,最后在stackoverflow上知道自己错在哪...

    Enterprise_
  • Linux中删除特殊名称文件的多种方式

    我们都知道,在linux删除一个文件可以使用rm命令,但是有一些特殊名称的文件使用普通的rm方式却没法删除,本文介绍linux中删除特殊名称文件的多种方式。

    编程珠玑
  • LeetCode 605. 种花问题

    假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。

    Michael阿明

扫码关注云+社区

领取腾讯云代金券