题目是这样的:
给出一个数组arr内容是0-99的数字,从中间随机取出一个数字x,剩下的数字在数组arr中递增排序,求:使用最优的方法从数组arr中找到随机取出的x是多少
下面写的是js语法形式
方法一:
这是最笨也是最普通的方法,时间复杂度为O(n),for循环整个数组,前后两两想减,如果为1说明不是要找的,如果是2说明是中间缺少一个数字的,然后当前i下标的数字+1就是去除来的数字x
var arr = [0,1,2,3,4,5,6,8,9] var x= searchNum1( arr ); console.log(x); function searchNum1( arr ){ if( arr.length <=0 ) return false; for ( var i= 0,len=arr.length;i<len;i++ ){ if( arr[i+1] - arr[i] == 2 ){ return arr[i]+1; } } }
结果是: 7
方法二:
优化的写法,利用首尾相加值相同的原理,减少for循环的循环次数,时间复杂度为O(n/2) , 当首尾相加的和不等于9时,说明这两个数字的附近有一个就是要找的数字x,然后分别往前和往后计算差值是否为1就可以确认x是多少了,另外这个方法要处理下中间的数字,由于长度是奇数,所以中间的数字是个独立的数字不会跟任何其他数字相加,所以单独处理下
var arr = [0,1,2,3,4,5,6,8,9] var x= searchNum( arr ); console.log(x); function searchNum( arr ){ if( arr.length <=0 ) return false; var middleI = Math.floor(arr.length/2); for ( var i= 0,len=arr.length;i<middleI;i++ ){ if ( arr[middleI]-arr[middleI-1] > 1 ) { return arr[middleI]-1; } else if( arr[middleI+1]-arr[middleI] > 1 ){ return arr[middleI]+1; } else { if( arr[i] + arr[len-i-1] !== 9 ){ if( arr[i]-arr[i-1] !== 1 ){ return arr[i]-1; } else if( arr[len-i] + arr[len-i-1] !== 1 ){ return arr[len-i-1]+1; } break; } } } }
网友如果有更优的方法,欢迎吐槽评论共赏