字节跳动二面 找出最小间断数

Posted zhaolei1996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节跳动二面 找出最小间断数相关的知识,希望对你有一定的参考价值。

题目:给出一个数组,找出最小间断数,例如:[9,1,2,3,5,7,8]  最小间断数为3

最简单一种思路:将数组进行排序,排序后从最左端开始前一个元素与后一个元素相比,找出差不是1的即可,需要排序,时间复杂度就与排序算法相关,

第二种思路:找出数组中最大的一个元素,建立一个长度为该最大值的数组,然后遍历原始的数组,将元素组的值放到新数组中,并且放的下标位置就为元素的值,找到原数组最小的元素值,从该角标开始遍历新数组,若某一个位置的值为0则前一个位置就为所求,这种方式的话时间复杂度为O(n),但是空间复杂度得不到保证,与最大值相关

第三种思路:从第二种思路我们就知道,其实在新建数组中,最小值角标以前的位置我们就没有用到,那就可以将新数组中的所有元素往前移动,每一个元素放的角标不在为该元素的值了,而为该元素的值减去最小元素的值,这样的话就一定程度减小了空间复杂度;伪代码如下:

int[]  result = new int[max-min+1];

for(int i=0;i<array.length;i++){

  result[array[i]-min] = array[i];

}

 

for(int i=0;i<result.length;i++){

  if(result[i]==0){

    return result[i-1];

  }

}

上面的程序还遗留的有一个问题,若数组中含有0,则判断会有问题,解决方案:

int[]  result = new int[max-min+1];

for(int i=0;i<array.length;i++){

  result[array[i]-min] = array[i]-min;---------存储的值也减去最小值

}

 

for(int i=1;i<result.length;i++){--------i从1开始,因为第一个位置存的是最小值对应的值,肯定为0

  if(result[i]==0){

    return result[i-1]+min;

  }

}

 

还有一种解决方案:判断时不判断为0,用后一个数减去前一个数,若结果不为1,则前一个数就是

 

以上是关于字节跳动二面 找出最小间断数的主要内容,如果未能解决你的问题,请参考以下文章

字节跳动+百度+阿里巴巴高频面试题之链表专题

字节跳动+百度+阿里巴巴高频面试题之链表专题

字节跳动二面

字节跳动C++云原生二面(65min)

字节跳动C++云原生二面(65min)

字节跳动一二面过,有点飘,结果第三面准备不足,挂了…