长风的专栏

聚是一团火,散是满天星

03_decorator_装饰者模式

背景 设计一个咖啡饮料订单系统,能够获取每一种饮料的价格和描述 饮料由咖啡和调料组成,每种咖啡可以搭配多种调料 现有的设计:每种咖啡和调料的组合都生成一个类,单独生成价格和描述 问题 高耦合,咖啡和调料静态绑定后直接导致类爆炸 类爆炸直接导致一系列的开发维护问题 解决方案 将咖啡和调料从静...

2019-04-16 15:58:12

阅读数 48

评论数 0

02_observer_pattern_订阅者模式

背景 设计一个天气状态服务器,实时监测温度、湿度和气压,并将最新状态同步给订阅者。 旧设计方案:将每个订阅者的更新代码写死到服务端代码里。 问题 高耦合,服务端代码需要知道订阅者的实现 违反了开闭原则,新加订阅者需要修改服务端代码 解决方案 约定发布者跟订阅者之间的接口,抽象出注册、注销、...

2019-04-07 19:35:10

阅读数 33

评论数 0

01_strage_pattern_策略模式

背景 你需要中途接手开发一个模拟鸭子的游戏,游戏中有各种鸭子,它们有着不同的外貌,会游泳swim,会叫quack,后面可能会添加其他行为,比如飞行fly。 你的上一任开发已经离职,他对此系统采用了标准的OO技术,设计了一个鸭子超类,并让各种鸭子继承此超类。 问题 代码重复问题。各种鸭子叫的方...

2019-04-07 16:11:49

阅读数 28

评论数 0

设计模式学习笔记开篇

最近有一个想法:想要系统、灵活地学习设计模式,将其内化到自己的专业技能之中,达到凭借直觉即可应用的地步。 动机 从毕业到现在工作已经快两年的时间了,回望过去,感觉技术上毫无积累,这并不是一个我喜欢的状态,反而让自己内心有些慌。 为了职业生涯的长远打算,遂决定深入学习一些专业技能,先从《设计模式》开...

2019-03-31 11:08:38

阅读数 40

评论数 0

[LeetCode]9. Palindrome Number

func isPalindrome(x int) bool { if x<0 || (x!=0 && x%10==0) { return false } ...

2019-03-06 11:35:19

阅读数 93

评论数 0

[LeetCode]8.String to Integer (atoi)

由于负数范围比正数大,所以中间结果用负数保存 func myAtoi(str string) int { startPos, mark := func(str string) (int, int) { mark := 1 for i := 0; i < len(st...

2019-03-05 15:25:26

阅读数 121

评论数 0

全排列

可以使用并发的方式来跑。 void PermutationImpl(char *begin_ptr, const char *ori_str) { if (*begin_ptr == '\0') { printf("%s\n", ori_...

2019-02-21 08:57:12

阅读数 9

评论数 0

[LeetCode]6. ZigZag Conversion

热身练手题 func convert(s string, numRows int) string { if numRows <= 1 || len(s) <= numRows { return s } var result []...

2019-02-16 09:53:29

阅读数 17

评论数 0

[LeetCode]5. Longest Palindromic Substring

题解: 遍历字符串,以每个字符为回文串的中心,对于aabbaa这种形式,将bb合并,这样就可以统一处理 代码: func longestPalindrome(s string) string { len := len(s) if len <= 1 { ...

2019-02-15 22:51:33

阅读数 15

评论数 0

[LeetCode]3. Longest Substring Without Repeating Characters

题解: 直观上能想到肯定有复杂度为O(N)的算法,肯定是要遍历一次字符串,肯定要记录当前字符的位置,每遍历一个字符统计一下当前达到的最大子串长度,需要记录左边界的位置,并实时更新。 代码: func lengthOfLongestSubstring(s string) int { resu...

2019-02-15 18:10:06

阅读数 21

评论数 1

[LeetCode]2. Add Two Numbers

原题 题解:链表模拟加法,注意进位特殊处理 代码: /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func addT...

2019-02-15 15:59:29

阅读数 22

评论数 0

[LeetCode]1.Two Sum

原题 题解: 简单哈希表 代码 func twoSum(nums []int, target int) []int { var result []int m := make(map[int]int) for i, v := range nums { if ...

2019-02-14 19:54:24

阅读数 34

评论数 0

字典树的实现

字典树又称为前缀树或Trie树,是处理字符串的常见数据结构。本实现提供了以下四个主要功能。 1.bool Insert(const string& word) 添加word,可重复添加 2.bool Delete(const string&a...

2018-06-02 11:43:56

阅读数 130

评论数 0

UML关系总结

在UML中,事物间的关系按照is a, has a和use a三个层级可以分为六种关系。分别是泛化:generalization、实现:realization、组合:composition、聚合:aggregation、关联:association以及依赖:dependency。 1.泛化:ge...

2018-05-29 20:30:39

阅读数 77

评论数 0

字符串转整数atoi

字符串转整数很容易把代码写得难看。下面这段代码算是难得的优雅了,精妙的地方在于使用负数存储中间值,避免了过多的边界检查,而且将遍历单独抽了出来,虽然多了次遍历,但是代码因此变得整洁,是个划算的权衡。 bool IsValid(const char *str, int len) { ...

2018-05-25 09:01:11

阅读数 155

评论数 0

寻找二叉树的最大搜索子树

Node *GetMaxSubBST(Node *root) { if (root == NULL) return NULL; int tree_size = 0; // 最大搜索树的节点个数 int max_value =...

2018-04-24 09:39:10

阅读数 182

评论数 0

二叉树的三种非递归遍历方式

#include <iostream> #include <algorithm> #include <stack> #include <cmat...

2018-04-16 23:52:04

阅读数 90

评论数 2

判断单向链表是否有环

/* 问题:判断一个链表是否有环,有则返回环的入口节点,没有则返回NULL * 思路:一个快指针和一个慢指针可以判断是否有环。设链表头节点的位置是a,快慢指针交点为b,环入口点为c. * dist(a,c)表示a点到c点的距离,R为环的长度 * 相交时慢指针走的距离为dist(a,c)+di...

2018-04-09 21:16:27

阅读数 69

评论数 0

LintCode.360.滑动窗口的中位数

/** LintCode.360.滑动窗口的中位数 * 题目: * 给定一个包含 n 个整数的数组,和一个大小为 k 的滑动窗口,从左到右在数组中滑动这个窗口, * 找到数组中每个窗口内的中位数。(如果数组个数是偶数,则在该窗口排序数字后,返回第 N/2 个数字。) *...

2018-02-21 21:32:45

阅读数 167

评论数 0

LintCode.391.数飞机

好久没有写博客。还有一个小时就从深圳回家过年,闲着没事就去LintCode随机找了道题练练手。 题目描述: 给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机?(如果多架飞机降落和起飞在同一时刻,我们认为降落有优先权。) 样例: 对于每架飞机...

2018-02-13 17:10:00

阅读数 115

评论数 2

提示
确定要删除当前文章?
取消 删除
关闭
关闭