1. 程式人生 > >查詢陣列中重複的唯一元素+時間複雜度O(n)+空間複雜度O(1)

查詢陣列中重複的唯一元素+時間複雜度O(n)+空間複雜度O(1)

這是我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]);