7 邱正钢

腾讯科技 - 后台开发工程师

A Linux C++ Programmer.

添加认证
等级
TA的排名 2k+

Haskell实现快排

使用haskell实现的快排代码真的是相当简洁,直观,很有美感。相对于C系列语言来说,haskell写算法的时候更关注算法本身是什么样子而不是怎么去实现这个算法,这点真的很棒。quicksort :: (Ord a) => [a] -> [a]quicksort [] = []quicksort (x:xs) = let smallPart = quicksort [a ...

2019-07-07 21:37:07

03_decorator_装饰者模式

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

2019-04-16 15:58:12

02_observer_pattern_订阅者模式

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

2019-04-07 19:35:10

01_strage_pattern_策略模式

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

2019-04-07 16:11:49

设计模式学习笔记开篇

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

2019-03-31 11:08:38

[LeetCode]9. Palindrome Number

func isPalindrome(x int) bool { if x<0 || (x!=0 && x%10==0) { return false } sum := 0 for sum < x { sum = sum*10 + x%10 x /= 10 } ret...

2019-03-06 11:35:19

[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(str); i++ { if unicode.IsSpace(rune(str[i])) { continu...

2019-03-05 15:25:26

全排列

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

2019-02-21 08:57:12

[LeetCode]6. ZigZag Conversion

热身练手题func convert(s string, numRows int) string { if numRows <= 1 || len(s) <= numRows { return s } var result []byte // 字符串拼接 var kGroupSize = numRows * 2 - 2 len := ...

2019-02-16 09:53:29

[LeetCode]5. Longest Palindromic Substring

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

2019-02-15 22:51:33

[LeetCode]3. Longest Substring Without Repeating Characters

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

2019-02-15 18:10:06

[LeetCode]2. Add Two Numbers

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

2019-02-15 15:59:29

[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 prev_idx, ok := m[target-v]; ok { resul...

2019-02-14 19:54:24

字典树的实现

字典树又称为前缀树或Trie树,是处理字符串的常见数据结构。本实现提供了以下四个主要功能。1.bool Insert(const string& word) 添加word,可重复添加2.bool Delete(const string& word) 删除word,如果word添加过多次,仅删除一个3.bool Search(const string& word) 查询...

2018-06-02 11:43:56

UML关系总结

在UML中,事物间的关系按照is a, has a和use a三个层级可以分为六种关系。分别是泛化:generalization、实现:realization、组合:composition、聚合:aggregation、关联:association以及依赖:dependency。1.泛化:generalization泛化是一种**is a**关系,表示一般到特殊的关系。比如“animal”...

2018-05-29 20:30:39

字符串转整数atoi

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

2018-05-25 09:01:11

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

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

2018-04-24 09:39:10

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

#include <iostream>#include <algorithm>#include <stack>#include <cmath>#include <climits>using namespace std;struct Node { Node *left; Node *right; in...

2018-04-16 23:52:04

判断单向链表是否有环

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

2018-04-09 21:16:27

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

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

2018-02-21 21:32:45

查看更多

勋章 我的勋章
  • GitHub
    GitHub
    绑定GitHub第三方账户获取
  • 脉脉勋章
    脉脉勋章
    绑定脉脉第三方账户获得
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv1
    勤写标兵Lv1
    授予每个自然周发布1篇到3篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。