Unity 面试精选程序员今日看点

面试题算法之一

2016-09-25  本文已影响247人  seafruit

题目简单描述一下

有0,1,2,3,…,n-1将他们乱序放入一个数组,请排序。

首先是提问:

想一想数值与下标的关系:

那么事情就好办了,此处选用C语言来完成这个题目。

分析:

int i=0;
while(i!=n){
    if(a[i]==i){
      i++;    
    }else{
      swap(a[i],a[a[i]]);
    }
}

紧接着第二问

现在该数组中存储的数值什么都有,负数也有正数也有,0也有,但依旧没有重复值,那么请找出这里面最小的没出现的正整数。

信息整理

思考

真的是这样吗?

{0,1,2,3,4,5,6}=>7
{0,1,2,3,4,5,7}=>6
{-1,-2,-3,-4,-5,-6,0}=>1
{-1,1,2,3,5,6,7}=>4
{7,1,2,3,4,5,6}=>8   ——>** 特别小心** !
遍历数组,从 i=1 开始,因为0不是正整数,可跳过。
i=1  a[1]!=1,此时应该输出1,就是 i;
1<i<n  a[i]!=i,此时应该输出 i ;
i=n  分为如下两种情况:
A. a[n-1] +1 != a[0],输出 i;
B. a[n-1] +1 == a[0],输出a[0]+1;

实现

int result,i=0;
while(i!=n){
    if(a[i]==i||a[i]<0||a[i]>=n){
        i++;
    }else{
        swap(a[i],a[a[i]]);
    }
}
for(i=0;a[i]==i&&i<n;i++);
result=i;
if(i==n&&a[n-1]==a[0]-1){
    result = a[0]+1;
}
printf("%d",result);
上一篇下一篇

猜你喜欢

热点阅读