读书 - 《Head first 设计模式》

Head first设计模式

豆瓣读书

为什么读这本书

在面XX家的时候,被问过一个设计模式问题。当时连面向对象都搞不懂,更不用说设计模式。

于是入了“四人帮”的设计模式来看,被里面的内容彻底搞晕。然后只能找了这本看起来很娱乐化的书来读。

这本书大概有600多页,比“四人帮”书厚很多。一个原因是这本书是“范例驱动”的,包含很多“项目”背景介绍,以及实现思路;第二个原因是,这本书的示例代码用的是Java

(笑,不黑了好嘛。。。

为什么要设计模式

这世界唯一不变的,就是变化

(没有逼格的人连名人名言都引用不好。。。

我们的代码总是需要不断的改变来适应现实世界中不断的变化。(烧死那个PM!)

我们需要一种对代码影响最小的方式来修改软件以适应变化。这就是我们使用设计模式的原因。

“内隐知识”

设计模式有了名字,人们就可以认识到它的存在。对于没有名字的东西,人们几乎不可能认识到它的存在,并对之进行讨论。这种不能用语言表达的知识我们称之为内隐知识。

其实我们在写程序的时候,或多或少都用到了“设计模式”,只是我们没有意识到而已 …

more ...

匈牙利算法

概念

交错路

交错路:设P是图G的一条路,如果P的任意两条相邻的边一定是一条属于M而另一条不属于M,就称P是一条交错路。

通俗点来说,就是把一个图中的路径染成红黑两种。然后找出一条路,使这条路红黑交错

注:交错路是无向图,图中的箭头只是为了便于观察。

例如下图中的:(3) -> (2) -> (1)

图1

从端点扩张交错路

假设我们已经有一个红黑交错路P,其端点为AB,其路径被标记为黑红。此时,我们向P中的一个端点(假设为A)加入一条边T

此时我们有边T + 交错路P(黑红)。当我们将边T标记为黑色时,我们就扩展了交错路P。 如果我们要保持红黑交错路的性质。则我们必须将边T …

more ...

Codeforces 3C - Tic-tac-toe

啥?

Tic-tac-toe是我很久之前在CF上做的一道题。非常考细心的模拟题。

最近有同学和我讨论过类似的问题。于是拿出来重新做一遍。练练手。

原题做法

没有任何“算法”成分。纯模拟。

又由于数据量实在是太小(3 × 3的矩阵),所以只要是思路正确。代码怎么写都能过。

于是在这里就不赘述。手快的众位10分钟切此题无压力。

What's new?

如果我们扩展一下这个问题。如果让你设计一个Tic-tac-toe的对战系统(人机对战、人人对战等),你将如何设计?

the STATE pattern

我们可以看出,这个对战系统其实可以用一个状态机来表示。

https://github.com/Wizmann/assets/raw/master/wizmann-tk-pic/blog-tick-tac-toe.png

于是我们的对战系统也可以写成一个状态机的模式。

show me the CODE

首先我们声明一个State接口类型。

由于Tic-tac-toe游戏只有两种操作类型:P1 moveP2 move

所以我们的接口就很简单。

class State {
public:
    State …
more ...

How to "Rotate Image"?

啥?

原题戳我

Rotate Image

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Follow up:

Could you do this in-place?

示意图如下:

rotate-image

当然,矩阵中的数字不一定是规律的。

为什么要提出这个问题

自觉是一个不聪明的人(双低。。。<(=@_@;=)?>)。

别人一下子就想明白的事,在我这里要计算好几个来回。

所以努力想找到一个思维方法去弥补这个不足。

就以这题为例,如何使用简单、直接的方法,迅速正确的找出变化的映射规律。

初步思路 …

more ...

Codeforces Round #221 (Div. 2)不完全不正确题解

A. Lever

水题,杠杆原理。

^把字符串分割开。然后分别计算两边的重量即可。

#Result: Dec 24, 2013 6:04:41 PM    Wizmann  A - Lever   Python 2   Accepted     312 ms  4200 KB
def calc(ss):
    res = 0
    p = 1
    for item in ss:
        if item != '=':
            t = int(item)
            res += t * p
        p += 1
    return res

s = raw_input …
more ...

自己动手搭建第三方的Codeforces CDN

啥?

校园网上CF那叫一个卡。

原因是什么呢? 因为codeforces大量的使用了ajax技术,所以引用了很多js/css文件,并且引用的位置位于页面之前。

这就造成了,我们在上CF的时候,其实页面内容已经读取出来了。但是因为js/css文件没有加载完成,所以页面还是一片空白。

解决方案

由于js/css/img文件都是所谓的静态文件,那么我们可以缓存这些文件到一个访问速度快的网络上来。

这就是CDN技术。

CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度

但是俄罗斯人那边没有做CDN,或者他们的CDN距离天朝实在是太远了。

所以我们只好手动缓存这些静态文件到七牛云上,使用七牛的CDN技术来加速我们的访问了。

七牛云为个人用户提供了10G存储空间和每月10G流量,这对于我们缓存一个网站的静态文件来说,已经足富裕了。根据我现在的使用状况,所有静态文件加在一起大概在3M左右,搭建这样一个免费CDN可以供十几个人使用。

设计架构

我们使用CS模式来完成这个网站加速的任务。

Server端当然就是七牛云啦。复杂的任务都交给了工程师们完成,我们只需要声明需要缓存codeforces.com …

more ...


Codeforces Round #218 (Div. 2)不完全不正确题解

A. K-Periodic Array

将Array切片,然后按位统计某一位上1的个数C(1)和2的个数C(2)。然后在这一位上的操作数就为M = min(C(1), C(2))。

简单题

B. Fox Dividing Cheese

傻逼才错的题,不幸中枪。

不想多说了,直接看代码吧。手贱不是病,贱起来要人命。

C. Hamburgers

模拟 + 二分。

和CJL还讨论过这题的纯模拟做法,看了半天代码没找到问题。于是刚才用Python自己实现了一个,在代码正确的情况下,没有WA,但是T在了22组上。

所以这题最好使用二分,如果用模拟的话,需要考虑各种情况。代码见下,细节上注意就好。

D. Vessels

这题得好好讲一下~比赛时做出来了好得意~

Vessels

题意是给出一组层层叠的容器,每一个容器都有自己的容量。然后我们向某些容器里灌水,如果水的体积超过了某个容器的容量,则剩余的水溢出到下一个容器中。最后一个容器溢出的水会落到地面上 …

more ...

使用新类型创建更人性化的代码

啥?

这篇文章讨论了如何通过新建并非”必要“的新类型,来产生更人性化的C++代码。

关键词:

  • RAII
  • 智能指针
  • 接口友好
  • 模板
  • 模板特化
  • 依赖编译器的缺省行为

对于C++的艺术,我只是个入门者。如果文章中有什么问题,欢迎大家指出,我会及时进行修改。

一个友好的互斥锁

互斥锁的定义

互斥锁(英语:英语:Mutual exclusion,缩写 Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制。该目的通过将代码切片成一个一个的临界区域(critical section)达成。临界区域指的是一块对公共资源进行访问的代码,并非一种机制或是算法。一个程序、进程、线程可以拥有多个临界区域,但是并不一定会应用互斥锁。

如何使用互斥锁

这里只做最简单的示范。具体的使用方法和原理不在本文的讨论范围之内。

#include <pthread.h>

class MyIntArray …
more ...

Yunfile下载破解[废弃]

废弃原因

因为Yunfile现在开始限IP + 无限抽风,所以插件已经废弃不用了。现在也没找到解决方法。\o<(=╯□╰=)>o

啥?

大家都知道Yunfile是做什么的咩?反正我是不知道。。。

今天下午无聊,写了一个yunfile下载的破解插件。

功能:

  • 非会员跳过下载等待的30s(或者更长时间)

  • 下载页面不会报“因长时间未操作,需要重新下载”的错误

这里感谢luacloud博文,为插件的编写提供了原型。

具体功能实现:

跳过等待

在上面引用的博文里面有说,就是强制执行页面中的js,实现跳转。

还做了一个DOM修改,变成现在这种很漂漂的样子~~

Yunfile-Craker-1

忽略超时错误

覆盖了下载函数,跳过超时判断。

现有问题

在一些情况下,点击下载按钮会返回到下载页。

虽然我们不需要再等30s了,但是还是很烦。

也有我有机会修复这个问题。

代码

代码在这里呀~

more ...