这是我BIGO前端面试时,面试官给我出的一道题,题目是长度为N的数组,元素大小范围在[1,N-1],只有一个重复的元素,用O(n)的时间复杂度和O(1)的空间复杂度找出来这个重复的元素,
大致思路
1、因为总共有N个数,每个数的范围是1到N-1,只有一个重复的数,所以这些数肯定是连续的
2、把对应的数放到与之对应的位置上去
3、因为这些书不包含0,所以可以一直操作arr[0],把arr[0]上的数字放到对应的位置上去,再把那个位置上的数字放到arr[0]上去
4、如此循环操作,当arr[0]上的数字与对应位置上的数字相等时,就找到了重复的元素
5、最坏的情况下循环N次一定能找出来重复的元素
下面是我整理后的JavaScript代码:
var arr = [8,1,3,10,11,12,13,14,4,2,6,15,7,16,5,9,17,24,18,19,20,21,22,23,31,25,26,27,28,29,30,5];
var count=0;//用来统计循环的次数,可以去掉
while(1)
{
if(arr[0]==arr[arr[0]])//判断第0位元素与该元素值指向的元素是否相等,如果相等了,就找到重复的了,退出循环
{
alert(arr[0]);
break;
} if(arr[0]!=arr[arr[0]]){ //如果不相等,就交换位置,把第0位置的元素送到与它对应的位置上去
var temp = arr[0];
arr[0]=arr[arr[0]];
arr[temp]=temp;
}
count++;//循环一次,计数+1
}console.log(count]);