日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

找出数组中两个只出现了一次的数

發布時間:2023/11/29 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 找出数组中两个只出现了一次的数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原題:給一組數,只有兩個數只出現了一次,其他所有數都是成對出現的。怎么找出這兩個數。

編寫函數實現。?

? ? 對于一組數中只有一個數只出現一次,其他所有數都是成對出現的,我們采用了對全部數組元素進行異或,經過分析發現異或全部數組的數所得到的數為整個數組中兩個只出現一次數異或的結果先對所有的元素進行異或。可以通過將結果轉換為二進制,在移位二進制數中的第一個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

總結

以上是生活随笔為你收集整理的找出数组中两个只出现了一次的数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。