第2周
Algorithm:
给出n代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解:
用递归算法,在n-1个括号已生成的情况下,增加1个括号
n-1个括号分成左、右两部分,左边有l个,l为[0,n-1]之间的数字,
右边括号数为n-1-l
class Solution {
public List<String> generateParenthesis(int n) {
List<String> strList = new ArrayList<String>();
// 用递归算法,在n-1个括号已生成的情况下,增加1个括号
// n-1个括号分成左、右两部分,左边有lNum个,lNum为[0,n-1]之间的数字,
// 右边括号数为n-1-lNum
if (n == 0) { strList.add(""); return strList;}
String str = "";
for (int lNum = 0; lNum < n; ++lNum) {
for (String lstr : generateParenthesis(lNum)) {
for (String rstr : generateParenthesis(n-1-lNum)) {
str = "(" + lstr + ")" + rstr;
strList.add(str);
}
}
}
return strList;
}
}
后续:
1、算法的复杂度分析
2、用回朔算法实现一下,并分析复杂度是否改善
Review:
C语言相对来说是一门比较“古老”的语言了,但它的流行程度一直到今天还是居高不下。这篇文章讨论了为何要学习C语言的理由,总结下来:
1、C语言是编写操作系统、系统软件、其他程序语言的语言,所以做这方面工作的人需要学习;
2、C语言更贴近计算机硬件,能让程序员对计算机底层工作原理的理解更为清晰、深刻,这对任何编程工作和解决程序问题都是非常有用的。
Tip:
记录一个生产系统的发生的真实事件:某联机交易系统,上线后交易量突发增长,在交易高峰期出现连接数据库错误。查找原因后,发现应用进程采用短连接方式连接数据库,一笔交易开始时连接数据库,完成处理后断开数据库连接。由于按照TCP协议,客户端断开TCP连接后,为了能尽量接收完关闭连接后遗留在网络上的报文,本地随机端口将被继续占用一小段时间(2MSL,一般1-2分钟左右)。因此如果断开连接后,新交易马上进来,应用进程再次连接数据库,刚才所用的本地随机端口处于无法使用状态,需要占用新的本地随机端口。由于高峰时交易TPS很高,进程不断连接数据库,导致本地随机端口不断被占用,最终出现因为无端口可用,导致连接不上的问题。
解决办法: 设置“地址重用”socket选项(SO_REUSEADDR),但这是有风险的(后面的进程接收到前面进程的信息,会搞乱进程,虽然概率不高)。彻底的解决办法是优化应用程序,改为长连接,并限制连接数,这样应用性能也会提高。
Share:
Asynchronous I/O (墙外)
近期在深入了解netty,netty基于NIO,NIO在操作系统层是通过IO多路复用实现的,在硬件层是通过IO设备中断实现。了解相关知识,能对应用层的实现有更深的理解。