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(j<n)
    {
        if(a[j]==0)
            j++;
        else 
        {
            if(i!=j)
                a[i]=a[j];
            i++;
            j++;
        }
    }
    for(;i<n;++i)
        a[i]=0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值