劍指offer總結 面試相關題 合併有序陣列

2021-10-08 13:31:30 字數 3301 閱讀 2034

題目:

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

實現1:返回新陣列

要點: 要返回乙個新陣列,這個陣列在函式中需要用new的方式申請記憶體,這樣的陣列儲存與堆中,在函式返回後並不會銷毀,並且要在函式體外自行delete;如果陣列在函式中使用普通變數的形式初始化,這樣的陣列儲存在棧中,在函式返回後會銷毀,導致函式體外訪問異常;

一句話就是不能返回區域性變數的指標或者引用!

#include

using

namespace std;

int*

merge

(int a,

int la,

int b,

int lb)

else

if(b ==

nullptr

)else

else

}return c;}}

intmain()

;int arr2=

;int

*arr3 =

merge

(arr1,

7, arr2,8)

;for

(int i =

0; i <

15;i++

)delete

arr3;

}

實現2:從前往後修改原陣列

思路:a、b兩個有序陣列合併到a中。

(1)若b為空 則退出函式。

(2)若當前陣列長度《合併後總長度,則迴圈判斷

①b已經遍歷完 退出函式;

②a已經遍歷完,迴圈把b插入到a中。

③a[pa]>b[pb],將a往後移再插入b

④a[pa]#include

using

namespace std;

//從前往後

void

merge1

(int

* a,

int la,

const

int*b,

int lb)

while

(newlenght < wholelength)

//陣列a已經遍歷完,直接插入b

else

if(pa-pb==la)

//a>b,後移並插入b

else

if(a[pa]

>b[pb]

) a[pa++

]= b[pb++];

newlenght++;}

//aelse}}

void

test

(char

* testname ,

int* a,

int la,

const

int*b,

int lb)

cout << endl;

}//a為空

void

test1()

;test

("test01"

, arr1, la, arr2, lb);}

//b為空

void

test2()

;int arr2[lb]

;test

("test02"

, arr1, la, arr2, lb);}

//a和b一樣長

void

test3()

;int arr2[lb]=;

test

("test03"

, arr1, la, arr2, lb);}

//a比b長

void

test4()

;int arr2[lb]=;

test

("test04"

, arr1, la, arr2, lb);}

//b比a長

void

test5()

;int arr2[lb]=;

test

("test05"

, arr1, la, arr2, lb);}

intmain()

實現3:從後往前修改原陣列

思路:定義兩個指標,oriend指向原陣列a的末尾,newend指向合併後陣列的末尾。

思路和實現2差不多,只是指標是往前移動。

#include

using

namespace std;

//從後往前

void

merge2

(int

* a,

int la,

const

int*b,

int lb)

else

else

if(pb<0)

else

if(b[pb]

>=a[oriend]

)else

}return;}

}void

test

(char

* testname ,

int* a,

int la,

const

int*b,

int lb)

cout << endl;

}//a為空

void

test1()

;test

("test01"

, arr1, la, arr2, lb);}

//b為空

void

test2()

;int arr2[lb]

;test

("test02"

, arr1, la, arr2, lb);}

//a和b一樣長

void

test3()

;int arr2[lb]=;

test

("test03"

, arr1, la, arr2, lb);}

//a比b長

void

test4()

;int arr2[lb]=;

test

("test04"

, arr1, la, arr2, lb);}

//b比a長

void

test5()

;int arr2[lb]=;

test

("test05"

, arr1, la, arr2, lb);}

intmain()

劍指offer 面試35題

面試35題 題目 複雜鍊錶的複製 題 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路一 python作弊法 解題 coding ...

劍指offer 面試33題

面試33題 題 二叉搜尋樹的後序遍歷序列 題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。解題思路 遞迴 解題 coding utf 8 class solution defverifysquenceof...

劍指offer 面試31題

面試31題 題目 棧的壓入 彈出元素 題 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出...