找出数组中两个只出现了一次的数
原題:給一組數,只有兩個數只出現了一次,其他所有數都是成對出現的。怎么找出這兩個數。
編寫函數實現。?
? ? 對于一組數中只有一個數只出現一次,其他所有數都是成對出現的,我們采用了對全部數組元素進行異或,經過分析發現異或全部數組的數所得到的數為整個數組中兩個只出現一次數異或的結果先對所有的元素進行異或。可以通過將結果轉換為二進制,在移位二進制數中的第一個1,然后根據這個1的判斷條件將整個數組分為兩組,分別對兩個組的元素進行全部異或,則就找出兩個不同的數。
例如:數組中的元素為下面這些數:
????????????????????????????0000??????--0
????????????????????????????0000??????--0
????????????????????????????0001??????--1
????????????????????????????0001??????--1
????????????????????????????0010??????--2
????????????????????????????0011??????--3
????????????????????????????0011??????--3
????????????????????????????0100??????--4
????????????????????????????0100??????--4
????????????????????????????0101??????--5
全部元素異或的結果為:0111????以最后面的1為條件,分為第一組(1、1、3、3、5)和第二組(0、0、2、4、4),分別對兩組元素進行全部異或。
代碼如下:
#include<stdio.h> #include<stdlib.h>int?find_one(int?num)//返回二進制數find中第一個出現1的位數,即位移量 {int?tmp?=?0;while?(num){if?(num?&?1?==?1)//進行與運算,找出現1的位數{return?tmp;}else{tmp++;num?=?num?>>?1;}}return?-1; }int?find(int?str[],int?size,int?*p1,int?*p2) {int?find?=?0;int?i,pos;for?(i?=?0;?i?<?size;?i++){//異或整個數組的數所得到的數find,即為數組中兩個只出現一次數異或的結果find?^=?str[i];}pos=find_one(find);for?(i?=?0;?i?<?size;?i++){//將整個數組分成兩部分,找出兩個數if?(1?&?(str[i]?>>?pos)){*p1?^=?str[i];}else{*p2?^=?str[i];}} }int?main() {int?arr[]?=?{?1,?2,?3,?5,?7,?2,?5,?1?};int?len;int?num1?=?0;int?num2?=?0;len?=?sizeof(arr)?/?sizeof(arr[0]);find(arr,?len,&num1,&num2);//注意此處num1和num2應傳遞地址printf("%d?%d\n",?num1,?num2);system("pause");return?0; }
轉載于:https://blog.51cto.com/luoyafei/1715263
總結
以上是生活随笔為你收集整理的找出数组中两个只出现了一次的数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到未来老婆是什么征兆
- 下一篇: Cocos2D将v1.0的tileMap