2019校招-美團-後臺開發工程師面試演算法題
阿新 • • 發佈:2019-01-11
美團後臺開發工程師
- 演算法題
已知有陣列a[]={0,1,0,3,0,12};
實現將陣列中的0全部移到陣列的最後,並保證其他元素是排序的 ,即輸出為a[]={1,3,12,0,0,0};
要求時間複雜度高
我的思路:
首先用兩個變數i,j來控制,兩者皆指向陣列的開始位置,用i記錄當前為0的位置,讓j++來查詢不為0的元素,找到之後將j下標的值賦值給i下標,i和j再同時向後移動,直到j找到最後一個元素,此時整個陣列的全部非0數已經被放到了i下標之前的位置。從當前i下標開始到陣列結束全部賦值為0即可。演算法複雜度為O(n)
程式碼實現:
void sort(int a[],int n)
{
//int n=sizeof(a)/sizeof(int);//不能在內部求陣列的長度,因為此時傳過來的陣列a已經退化成了指標,求出來的n是錯誤的。直接在引數列表中傳入陣列長度
int i=0,j=0;
while(j<n)
{
if(a[j]==0)
j++;
else
{
if(i!=j)
a[i]=a[j];
i++;
j++;
}
}
for(;i<n;++i)
a[i]=0 ;
}