前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日两题 T20

每日两题 T20

作者头像
合一大师
发布2020-07-20 09:51:02
2700
发布2020-07-20 09:51:02
举报
文章被收录于专栏:JavaScript全栈

算法

LeetCode T22. 括号生成[1]

描述

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

示例

代码语言:javascript
复制
输入:n = 3
输出:[
       "((()))",
       "(()())",
       "(())()",
       "()(())",
       "()()()"
     ]

分析

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

观察可得:

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

代码

代码语言:javascript
复制
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

代码语言:javascript
复制
for (var i = 0; i< 10; i++){
   setTimeout((i) => {
           console.log(i);
   }, 1000,i)
}

分析

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

方法一

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

代码语言:javascript
复制
for (var i = 0; i < 10; i++) {
  setTimeout(i => {
    console.log(i);
  }, 1000, i)
}

或者

代码语言:javascript
复制
for (var i = 0; i < 10; i++) {
  setTimeout(console.log, 1000, i)
}

或者

代码语言:javascript
复制
for (var i = 0; i < 10; i++) {
  setTimeout(console.log.bind(null, i), 1000)
}

方法二

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

代码语言:javascript
复制
for (let i = 0; i < 10; i++) {
  setTimeout(() => {
    console.log(i);
  }, 1000)
}

方法三

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

代码语言:javascript
复制
for (var i = 0; i < 10; i++) {
  (i => {
    setTimeout(() => {
      console.log(i);
    }, 1000)
  })(i)
}

方法四

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

代码语言:javascript
复制
for (var i = 0; i < 10; i++) {
  setTimeout(new Function('console.log(i)')(), 1000)
}

References

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaScript全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 算法
    • LeetCode T22. 括号生成[1]
      • 描述
        • 分析
          • 代码
          • 前端
            • 改造下面的代码,使之输出0 - 9
              • References
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档