劍指Offer 第2章課後題詳解

2021-09-23 19:40:00 字數 1895 閱讀 8636

兩個佇列實現棧

2的整數次方

不同位數

有兩個排序的陣列a1和a2,內存在a1的末尾有足夠多的空餘空間容納a2。請實現乙個函式,把a2中的所有數字插入到a1中並且所有數字是排序的。

其實這道題就是實現乙個歸併排序,只是在陣列中,資料是順序儲存的,如果在陣列頭部進行歸併排序,每一次操作都會移動後面所有的資料,開銷很大。所以應該從尾部進行操作。

//兩個陣列的初始實際長度是固定,而陣列a2也不需要進行改動,所以都可以宣告為常量,進行保護。題目中已經說明空間足夠,不然還需要再宣告乙個引數length,表示a1的維度,與a1,a2的初始長度之和進行比較,以防越界。

auto insertarray(int *a1, const

int length1, const

int *a2, const

int length2) -> void

else

}//如果陣列a2中還有元素沒有插入到陣列a1中,則全部依次插入到陣列a1前面位置

while(j >= 0)

}

使用標準庫中的vector(可變大小陣列)和泛型演算法會讓**變得相當簡單,但相應地演算法的時間複雜度會受到影響(因為會進行一次排序)。

//傳入兩個vector的引用

auto inservector(vector

&a1, vector

&a2) -> void

棧宣告如下:

template

class cstack;

根據佇列的先進先出原則和棧的後進先出原則,可以進行如下設計:先將入棧元素依次加入到佇列1中,出棧時,將佇列1除隊尾元素外依次加入到佇列2中,再彈出佇列1中的最後乙個元素(隊尾元素)。再有元素入棧時,就加入到佇列2中,出棧時,將佇列2除隊尾元素外依次加入到佇列1中,再彈出佇列2中的最後乙個元素(隊尾元素)。之後元素入棧,又加入到佇列1中,依此類推。

template

void cstack::push(const t& node)

else

}template

t cstack::pop()

//將佇列1除隊尾元素外依次加入到佇列2中

while (queue1.size() > 1)

//修改標誌

flag = 0;

//彈出並返回隊尾元素

t head = queue1.front();

queue1.pop();

return head;

}else

while (queue2.size() > 1)

flag = 1;

t head = queue2.front();

queue2.pop();

return head;

}}

用一條語句判斷乙個整數是不是2的整數次方。

乙個整數如果是2的整數次方,那麼它的二進位制表示中有且只有一位是1,而其他所有位都是0。把這個數減去1之後,原本為1的那一位會變成0,而在這一位之後的所有0都會變成1。把這個整數與它減一後的數做與運算則結果為0。

auto iscubeof2(const

int n) -> bool

輸入兩個整數m和n,計算需要改變m的二進位制中多少位才能得到n。

問題等價於m和n中有多少位不同,所以將m和n進行異或運算再計算結果二進位制中的1的個數就完成求解。

auto differentnumber(const

int m, const

int n) -> int

flag = flag << 1;

}return count;

}

劍指Offer 第2章課後題詳解

有兩個排序的陣列a1和a2,內存在a1的末尾有足夠多的空餘空間容納a2。請實現乙個函式,把a2中的所有數字插入到a1中並且所有數字是排序的。其實這道題就是實現乙個歸併排序,只是在陣列中,資料是順序儲存的,如果在陣列頭部進行歸併排序,每一次操作都會移動後面所有的資料,開銷很大。所以應該從尾部進行操作。...

《劍指offer》 第2章(2)

2.3.5 棧和佇列 棧 後進先出,不考慮排序的資料結構,要找到最大最小元素需要o n 時間,若要在o 1 時間內找到最大最小值,需要對棧做特殊的設計。面試題9 用兩個棧實現佇列 測試用例 1.往空佇列裡新增元素 刪除元素 2.往非空佇列裡新增元素 刪除元素 3.連續刪除元素直到隊列為空 思路 1....

《劍指offer》筆記 第5章(2)

面試題42 連續子陣列的最大和 輸入乙個整型陣列,陣列裡有正數也有負數。陣列中乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度是o n 例如,陣列為,和最大的子陣列為,輸出位18。測試用例 功能測試 陣列中有正數也有負數 陣列中只有正數 陣列中只有負數 特殊輸入 陣列為nu...