原创 《劍指offer》4:替換空格

題意 給定一個字符串,將其中的所有空格都替換成”%20”三個字符,比如“I am happy.”將會變成”I%20am%20happy.”,假設給定的指針所指向的內存是夠用的,然後O(1)空間和O(n)時間。 思路 先統計空格的個

原创 leetcode: Combination Sum III

原題鏈接:https://leetcode.com/problems/combination-sum-iii/ 我在github上的leetcode倉庫:https://github.com/cooljacket/leetcode

原创 算法導論:紅黑樹

算法導論的紅黑樹講解很好,插入的調整比較容易懂,但是刪除的調整就有點難懂了,書裏也沒證明爲什麼那樣做就能夠保持性質(留做練習題了),雖然可以理解過程。 比較好玩的一點是,比較上次寫的二叉搜索樹,隨機插入1000000個結點是二

原创 最近發現的C++的幾個“黑科技”

delete[]的析構順序 先說一個小發現,在delete []的時候,是按照與構造順序相反的順序來析構的!(原來的構造順序指的是,new []的時候,是按照下標順序構造的) #include <iostream> using n

原创 《劍指offer》42:翻轉單詞順序

這個單元有兩道題,都是字符串操作,挺簡單的,不過如果沒經歷過思考的過程,可能就不是那麼容易了,簡單 != 容易。 書裏安排了比較簡單的左旋字符串在後面,我覺得反了,所以換了順序來說。 左旋字符串 將一個字符串“左移”k位,比如”

原创 可隨機訪問的隊列

需求 最近在做畢設,關於手勢識別的,自己yy了一種算法,實現裏面爲了方便,需要一種可供我隨機訪問的大小固定的隊列。 矛盾就是,STL裏提供的隊列只能訪問隊頭,所以就自己實現了一發。 設計 衆所周知,要支持隨機訪問,那麼底層就得用數組來實現

原创 Redis源碼:dict數據結構(實現)

高屋建瓴 本文分析的是src/dict.c文件。 從結構上來說,可以分爲: 1. 私有函數(以下劃線開頭的一般都是,一般都是一些輔助函數); 2. 公開API。 從功能來說,可以分爲: 1. dict初始化、析構; 2. 元素操作

原创 圖的兩種表示和接口

常讀常新 這裏多分析了三個點: 1. 兩種表示方式在另一個維度的比較; 2. 一種複雜應用場景下的取捨辦法; 3. 經典表示方法之外的黑科技。 衆所周知,在經典的圖論裏,圖的兩種表示方式爲: 1. 鄰接矩陣; 2. 鄰接表。 先

原创 Redis源碼:dict數據結構(聲明)

Redis的dict,譯爲“字典”,猶如Python裏的字典,底層是用哈希表實現的,好的實現可以達到O(1)的時間複雜度。衆所周知,哈希表其實就是一個數組,一個元素插入到哈希表時,先通過一個哈希函數將鍵值映射到一個下標。存儲和讀取都是如此

原创 shared_ptr循環引用的例子及解決方法示例

本文目標 本文默認讀者是已經瞭解了觀察者模式智能指針的來龍去脈,智能指針的介紹可以參考我的博客:話說智能指針發展之路。 之前看到循環引用的時候,總是隻能看到一個很簡單的例子,比如這個c++ 智能指針及 循環引用問題,我覺得挺沒意思,因爲沒

原创 virtualenv和它的原理

虛擬環境是一個將不同項目所需求的依賴分別放在獨立的地方的一個工具,它給這些工程創建虛擬的Python環境。它解決了“項目X依賴於版本1.x,而項目Y需要項目4.x”的兩難問題,而且使你的全局site-packages目錄保持乾淨和可管理

原创 話說智能指針發展之路

從RAII說起 教科書裏關於“動態創建內存”經常會提醒你,new一定要搭配delete來使用,並且delete掉一個指針之後,最好馬上將其賦值爲NULL(避免使用懸垂指針)。 這麼麻煩,於是乎,這個世界變成11派人: 一派人勤勤懇懇

原创 Redis源碼閱讀計劃

前人已經解讀過很多了,我並不是想超越前人,而是想自己學習一遍。決定根據黃健宏的建議,讀一遍,記下自己對Redis各個部分的解讀。 我閱讀的版本是3.2.8,當前(2017-04-06)最新的穩定發行版。 Redis是用C語言寫的,所以有

原创 用迭代實現歸併排序

最近在知乎上看到一個帖子,總結了各種常見的排序算法,並用python一一實現了,不過歸併排序的迭代寫法,題主說他不會寫,我就試了一下,其實很簡單。下面會先分析遞歸的時候實際上做了哪些事,然後迭代如何重現這些事。先用C++寫,因爲估計看這篇

原创 在單鏈表上實現插入排序

問題 給單鏈表排序(升序排列,要保持穩定性),要求通過改變結點的next指針從而改變結點的位置,而不是隻交換結點的值來使得其有序!時間複雜度爲O(N^2),空間複雜度爲O(1)。已知鏈表結點的實現如下: struct ListNode {