美团后台开发工程师
- 算法题
已知有数组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;
}