題目:
有兩個排序的陣列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就不可能是該壓棧序列的彈出...