每日两题 T20

时间:2022-07-22
本文章向大家介绍每日两题 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/