风云的ARTS打卡(第2周)

第2周

Algorithm: 

括号生成

给出n代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出= 3,生成结果为:

[

  "((()))",

  "(()())",

  "(())()",

  "()(())",

  "()()()"

]

解:

用递归算法,在n-1个括号已生成的情况下,增加1个括号

n-1个括号分成左、右两部分,左边有l个,l为[0,n-1]之间的数字,

右边括号数为n-1-l

class Solution {

    public List generateParenthesis(int n) {

            List strList = new ArrayList();

            // 用递归算法,在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:  

Why learn C?

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设备中断实现。了解相关知识,能对应用层的实现有更深的理解。

你可能感兴趣的:(风云的ARTS打卡(第2周))