2019校招-美团-后台开发工程师面试算法题

美团后台开发工程师

  • 算法题

已知有数组a[]={0,1,0,3,0,12};
实现将数组中的0全部移到数组的最后,并保证其他元素是排序的 ,即输出为a[]={1,3,12,0,0,0};
要求时间复杂度高

我的思路:

首先用两个变量i,j来控制,两者皆指向数组的开始位置,用i记录当前为0的位置,让j++来查找不为0的元素,找到之后将j下标的值赋值给i下标,ij再同时向后移动,直到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(jif(a[j]==0)
            j++;
        else 
        {
            if(i!=j)
                a[i]=a[j];
            i++;
            j++;
        }
    }
    for(;i0;
}

你可能感兴趣的:(面试)