Algorithms
Add Binary
思路:每次取出一个字符转为数字,如果无法取出字符则按0处理,加上进位carry,对2取余为当前位的数字,对2取商为当前进位的值,最后判carry,如果为1的话,要在结果最前面加上一个1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public: string addBinary(string a, string b) { string res = ""; int alen = a.size() - 1, blen = b.size() - 1, carry = 0; while (alen >= 0 || blen >= 0) { int p = alen >= 0 ? a[alen--] - '0' : 0; int q = blen >= 0 ? b[blen--] - '0' : 0; int sum = p + q + carry; res = to_string(sum % 2) + res; carry = sum / 2; } return carry == 1 ? "1" + res : res; } };
|
Sqrt(x)
思路:二分就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public: int mySqrt(int x) { if (x <= 1) { return x; } int left = 0, right = x; while (left < right) { int mid = left + (right - left) / 2; if (x / mid >= mid) { left = mid + 1; } else { right = mid; } } return right - 1; } };
|
Review
本周阅读英文文章 Data Security and Resilience using Secret Shares and Elliptic Curve Methods
Technique
使用协程完成带额外状态信息的回调函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
def apply_async(func, args, *, callback): result = func(*args) callback(result)
def print_result(result): print('Got:', result)
def add(x, y): return x + y
def make_handler(): sequence = 0 while True: result = yield sequence += 1 print('[{}] Got: {}'.format(sequence, result))
handler = make_handler() next(handler) apply_async(add, (2, 3), callback=handler.send) apply_async(add, ('hello', 'world'), callback=handler.send)
|
1 2
| [1] Got: 5 [2] Got: helloworld
|
Share
本周分享《计算机安全-原理与实践》攻击面与攻击树
一、攻击面
攻击面是由系统中可达到的和可被利用的脆弱点构成的。
攻击面的例子:
- 对外开放的Web和其他服务器的端口,监听这些端口的代码;
- 在防火墙内可用的服务;
- 处理进入内部的数据、电子邮件、XML、办公文档和工业级定制数据交换格式的代码;
- 界面、SQL和Web表单;
- 对敏感信息有访问权限的员工,这些敏感数据可能会受到社会工程学的攻击。
攻击面分类:
- 网络攻击面:指企业网、广域网或者局域网中的脆弱点或漏洞,包括网络协议中的脆弱点,例如利用这些弱点进行拒绝服务攻击、通信线路破坏和各种不同形式的入侵攻击。
- 软件攻击面:指应用程序、实用程序或操作系统中代码的漏洞,尤其是指Web服务器软件中的漏洞。
- 人为攻击面:指员工或者外部人员,诸如社会工程学、人为错误和受信任的内部人员引起的脆弱点。
二、攻击树
攻击树是一个分支型的、层次化的数据结构,表示了一系列潜在技术,这些技术可利用安全漏洞进行攻击。
作为攻击目标的安全事件是这个树的根节点,攻击者可以迭代地、递增地达到这个目标的途径就是这棵树的分支和子节点。每一个子节点都定义了一个子目标,每一个子目标都可能有一系列的进一步的子目标,等等。从根节点沿着路径向外延伸的最终的节点,也就是叶子节点,代表了发起一个攻击的不同方式。除了叶子节点外的每一个节点,或者是与节点(AND-node)或者是或节点(OR-node)。若想达成与节点表示的目标,则该节点的所有子节点代表的子目标都要求被实现。若想达成或节点表示的目标,则只需完成其中至少一个子目标即可。分支可以用代表难度、代价或其他攻击属性的值标注,以便与可选择的攻击进行比较。