找出陣列中唯一重複的數

2021-06-09 02:05:46 字數 3288 閱讀 5682

題目:

陣列a[n],1至n-1這n-1個數存放在a[n]中,其中某個數重複一次。寫乙個函式,找出被重複的數字。

方法一:異或法。

陣列a[n]中的n個數異或結果與1至n-1異或的結果再做異或,得到的值即為所求。

**:

#include 

#include 

#include 

#include

void xor_finddup(int * a,int n)    

for (i=1;i    

printf("%d\n",result);    

}    

int main(int argc, char* argv)    

;    

xor_finddup(a,5);    

return 0;    

}   

方法二:數學法。

對陣列的所有項求和,減去1至n-1的和,即為所求數。

#include 

#include 

#include 

#include

void xor_finddup(int * a,int n)    

tmp2+=a[n-1];  

int result=tmp2-tmp1;     

printf("%d\n",result);    

}    

int main(int argc, char* argv)    

;    

xor_finddup(a,5);    

return 0;    

}   

對於求和,可以直接根據公式定義乙個巨集。#define sum(x)  (x*(x+1)/2)

#include 

#include 

#include 

#include

#define sum(x)  (x*(x+1)/2) 

void xor_finddup(int * a,int n)    

int result=tmp2-tmp1;     

printf("%d\n",result);        

}    

int main(int argc, char* argv)    

;    

xor_finddup(a,5);    

return 0;    

}   

方法三:標誌陣列法

申請乙個長度為n-1且均為'0'組成的字串。然後從頭遍歷a[n]陣列,取每個陣列元素a[i]的值,將其對應的字串中的相應位置置1,如果已經置過1的話,那麼該數就是重複的數。就是用位圖來實現的。 如果考慮空間複雜度的話,其空間o(n)

#include 

#include 

#include 

#include

#define sum(x)  (x*(x+1)/2) 

void xor_finddup(int * arr,int num)    

for( i=0; i  

}    

}    

int main(int argc, char* argv)    

;    

xor_finddup(a,5);    

return 0;    

}    

方法四:固定偏移量法

a[n],裡面是1至n-1。原陣列a[i]最大是n-1,若a[i]=k在某處出現後,將a[k]加一次n,做標記,當某處a[i]=k再次成立時,檢視a[k]即可知道k已經出現過。該方法不用另外開闢o(n)的記憶體空間,但是在查重之後要將陣列進行恢復。

#include 

#include 

#include 

#include

void xor_finddup(int * arr,int num)    

else

}  printf("無重複");  

return ;   

}    

void clear(int *data,int num)//清理資料    

}  int main(int argc, char* argv)    

;    

xor_finddup(a,5);    

clear(a,5);  

return 0;    

}    

方法五:符號標誌法

上個方法出現後是加n,也可以出現後加個負號,就是符號標誌法。

#include 

#include 

#include 

#include 

#include

void xor_finddup(int * arr,int num)    

else

}                

printf("無重複");    

return ;    

}     

void clear(int *data,int num)//清理資料

}    

int main(int argc, char* argv)    

;       

xor_finddup(a,5);     

clear(a,5);      

return 0;    

}      

以上的方法對陣列元素的值的範圍是有限制的,如果陣列元素的值不是在1至n-1範圍時,可以先求出陣列元素的最大值。

#include 

#include 

#include 

#include 

#include

int  do_dup_mal(int arr, int n, int *pre, int *back)  

char *arrayflag = new

char[max+1] ;  

if (null == arrayflag)  

return -1;  

memset(arrayflag, 0, max+1 ); // '\0' == 0

for(i=0; i  

}  delete arrayflag;  

if (i < n)  

}  }  return

false;  

}  void main(int argc, char *argv)  

Python 如何找出陣列中唯一重複的元素

1.hash法 字典法 空間換時間 def finddup array if array none return 1 lens len array hashtable dict i 0 while i時間和空間複雜度都是o n 2.累加求和法 def finddup array if array n...

找出陣列中任一重複的數 C

乙個長度為n的陣列,陣列中的值屬於0 n 1 範圍內。現已知該陣列中一定有重複的數字,請找出任意乙個重複的數字。如果該陣列中沒有重複的數字,那麼下標和下標對應的值就相等了,即是array i i。利用好這點,尋求解題方法。include include using namespace std int...

求陣列中唯一重複的數字

求陣列中唯一重複的數字 陣列a n 1至n 1存在a中,有乙個是重複的,找出這個數字。第一種方法 include int main void int i,sum 0,x for i 0 i 11 i x sum 1 10 10 2 陣列總和 減去1到10得和多出來的就是重複的 printf d n ...