給定一個非空整型數組,除了某個元素只出現一次以外,其余每個元素均出現兩次,找出那個只出現了一次的元素。
樣例: int a[]={1,2,3,4,5,1,2,3,4},該數組中只有5出現一次,其他數字都是成對出現的,要找出5。
思路一:統記每個元素在數組中出現的次數,最后次數為1的那個元素就是要找的數。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[]={1,2,3,4,5,1,2,3,4};
//找出只出現一次的元素
int sz = 0;
int i = 0;
sz = sizeof(arr)/sizeof(arr[0]);
for(i = 0; i < sz; i++ )
{
//統計arr[i]在數組中出現的次數
int j;
int count = 0;//計數
for(j = 0;j < sz; j++)
{
if(arr[j]==arr[i])
{
count=count+1;
}
}
if(count == 1)
{
printf("只出現一次的數是%d\n",arr[i]);
break;
}
}
system("pause");
return 0;
}
思路二:引入異或運算,通過異或運算滿足交換律,可實現此要求
數a | 數b | 數c | 結果 | |
---|---|---|---|---|
0^5 | 000 | 101 | 101 | |
5^5 | 101 | 101 | 000 | |
5^1 ^5 | 101 | 001 | 101 | 001 |
5^5 ^1 | 101 | 101 | 001 | 001 |
代碼如下
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[]={1,2,3,4,5,1,2,3,4};
//找出只出現一次的元素
int sz = 0;
int i = 0;
int ret = 0;
sz = sizeof(arr)/sizeof(arr[0]);
for(i = 0; i < sz; i++ )
{
ret = ret^arr[i];
}
printf("只出現一次的數是:%d\n",ret);
system("pause");
return 0;
}