
思路一:
其實對待多個陣列的資料處理問題,最簡單粗暴的方法就是新建一個陣列,將處理后的資料存放到新開辟的陣列中,對待此問題,可以新建一個陣列,然后逐個比較陣列nums1和nums2中的元素,將小的數存放到新陣列中,然后再繼續對比,直到將元陣列中的元素都存放到新陣列中,但是要注意一個問題,就是當一個陣列中的元素已經全部都存放到新建的陣列中的時候,程式會跳出回圈,此時另一個陣列中仍然還剩余元素,現在要做的就是將剩下的元素依次存放到新陣列中,但是仍然需要注意,問題問的是存放到陣列nums1中,所以在程式的最后要將新建的nums中的元素轉移到陣列nums1當中,

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int start1=0;
int start2=0;
int start=0;
int* nums=(int*)malloc((m+n)*sizeof(int));
memset(nums,0,(m+n)*sizeof(int));//在函式中另外創建一個陣列,不能直接定義陣列,利用動態記憶體管理開辟,并利用memset函式初始化
while(start1<m&&start2<n)
{
if(nums1[start1]<nums2[start2])
{
nums[start++]=nums1[start1++];
}
else
{
nums[start++]=nums2[start2++];
}
}
while(start1==m&&start2<n)
{
nums[start++]=nums2[start2++];
}//當nums1陣列中的所有元素都已經放到新陣列中,nums2還剩余資料,直接將剩余資料拷貝到新陣列
while(start1<m&&start2==n)
{
nums[start++]=nums1[start1++];
}
for(int j=0;j<m+n;j++)
{
nums1[j]=nums[j];
}將nums陣列中的資料改放到nums1中
}
注意:在一個函式中需要一個新的陣列,不能直接定義,而是要通過動態記憶體管理開辟一塊空間,然后通過memset函式初始化,最后記得將新開辟的陣列中的資料拷貝到傳入的陣列中
思路二:
題目中已經說明了陣列nums1的空間大小為m+n,因此可以不再開辟新的陣列,直接將nums2中的資料存放到陣列nums1當中,把較大的數放到后面,因此要從陣列的最后開始,若是nums1有效元素中最后的元素比nums2的大,則將該資料放到nums1陣列的最后,否則就將nums2有效元素中最后的元素放到nums1陣列的最后,
注意:該方法中,當nums2陣列中的元素已經全部存放到nums1當中后,表示該程序已結束,但是當nums1中的元素已經全部都移到后面,而nums2中仍然剩余一部分元素,這時就需要把nums2中剩余的元素拷貝到nums1當中

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int end1=m-1;
int end2=n-1;
int end=m+n-1;
while(end1>=0&&end2>=0)
{
if(nums1[end1]<nums2[end2])
{
nums1[end]=nums2[end2];
end--;
end2--;
}
else
{
nums1[end]=nums1[end1];
end--;
end1--;
}
}
while(end1<0&&end2>=0)
{
nums1[end]=nums2[end2];
end--;
end2--;
}//當nums2中剩余元素,將剩余的元素拷貝到nums1中
}
在這種方法的考慮中,在nums1[end1]>nums2[end2]這個問題的解決時,剛開始時想到的是將nums1[end1]移到nums1[end]的位置,然后剩下的就是nums2[end2]向有序陣列中的插入問題,顯然這種思路把問題復雜化了,其實在進行賦值之后,eng1–,nums2[end2]自動與下一個元素進行比較,如此則不需要進行插入操作
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/274085.html
標籤:其他
上一篇:遞回(recursion) -- 實作功能(轉換型別 / 添加新屬性)
下一篇:前端設計稿還原問題
