原创 Google 2016 面試題2 | 不構造樹的情況下驗證先序遍歷

題目描述 給出一個字符序列,問該序列是否是一棵合法的二叉樹的先序遍歷? 找到一種不需要構造二叉樹的方法。 For example: “9,3,4,#,#,1,#,#,2,#,6,#,#” 是下面這顆二叉樹的先序遍歷。其

原创 Google 2016 面試題5 | 島嶼計數2

題目描述 給出一個m行n列的網格地圖,每個位置爲0或1,0表示海水1表示陸地。一開始地圖全爲0(沒有陸地)。每次在一個位置加入一塊陸地,返回此時地圖中陸地的總塊數(相鄰陸地統計時爲同一塊陸地)。 Example: 操作#1:

原创 策略模式(Strategy)

一、模式動機 完成一項任務,往往可以有多種不同的方式,每一種方式稱爲一個策略,我們可以根據環境或者條件的不同選擇不同的策略來完成該項任務。 在軟件開發中也常常遇到類似的情況,實現某一個功能有多個途徑,此時可以使用一種設計模式來使

原创 命令模式(Command)

一、模式動機 在軟件設計中,我們經常需要向某些對象發送請求,但是並不知道請求的接收者是誰,也不知道被請求的操作是哪個,我們只需在程序運行時指定具體的請求接收者即可,此時,可以使用命令模式來進行設計,使得請求發送者與請求接收者消除

原创 訪問者模式(Visitor)

一、模式動機 對於系統中的某些對象,它們存儲在同一個集合中,且具有不同的類型,而且對於該集合中的對象,可以接受一類稱爲訪問者的對象來訪問,而且不同的訪問者其訪問方式有所不同,訪問者模式爲解決這類問題而誕生。 在實際使用時,對同一

原创 Google 2016 面試題3 | 擺動排序 II

題目描述 給出一個整數數組nums,重新排列nums使得nums[0] < nums[1] > nums[2] < nums[3]… Example: nums = [1, 5, 1, 1, 6, 4], 一個可能的答案是[

原创 備忘錄模式(Memento)

一、模式動機 在應用軟件的開發過程中,有時我們有必要記錄一個對象的內部狀態。爲了允許用戶取消不確定的操作或從錯誤中恢復過來,需要實現備份點和撤銷機制,而要實現這些機制,我們必須事先將狀態信息保存在某處,這樣狀態才能將對象恢復到它

原创 Google 2016 面試題6 | Count of Smaller Numbers After Self(數組計數)

題目描述 給定一個數組nums,返回一個計數數組count,count[i]表示nums中第i個右邊有多少個數小於nums[i] Example: nums = [5, 2, 6, 1] 輸出[2,1,1,0] 分析解答

原创 CodeBlocks靜態鏈接與動態鏈接設置

靜態庫和動態庫的區別 1.靜態庫 之所以稱之爲”靜態庫”,是因爲在鏈接階段,會將彙編生成的目標文件.o與引用到的庫一起鏈接打包到可執行文件中。因此對應的鏈接方式稱爲靜態鏈接。 從本質上來說,一個靜態庫可以簡單看成是一組目標文件(

原创 軸對稱

題目描述 給定平面上的n個點,問是否存在一條平行於y軸的直線,使得這n個點相對於這條直線對稱。 Follow-up 是否存在一條直線使得這n個點關於這條直線對稱? 算法分析 因爲對稱軸一定平行於y軸,對稱軸的特點就是每一個點都

原创 C++11 中的右值引用與轉移語義

本文介紹了 C++11 標準中的一個特性,右值引用和轉移語義。這個特性能夠使代碼更加簡潔高效。 新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新標準 (C++11, 11 代表 2011 年 ) 中引入的

原创 模板方法模式(Template Method)

一、模式動機 準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模版方法模式的用意。 模

原创 線段樹

線段樹的構造 線段樹是一棵二叉樹,他的每個節點包含了兩個額外的屬性start和end用於表示該節點所代表的區間。start和end都是整數,並按照如下的方式賦值: 根節點的 start 和 end 由 build 方法所給出。

原创 迭代器模式(Iterator)

一、模式動機 一個聚合對象,如一個列表(List)或者一個集合(Set),應該提供一種方法來讓別人可以訪問它的元素,而又不需要暴露它的內部結構。 針對不同的需要,可能還要以不同的方式遍歷整個聚合對象,但是我們並不希望在聚合對象的

原创 Google 2016 面試題1 | 數組補丁

題目描述 給出一個從小到大排好序的整數數組nums和一個整數n,在數組中添加若干個補丁(元素)使得[1,n]的區間內的所有數都可以表示成nums中若干個數的和。返回最少需要添加的補丁個數。 Example 1: nums