只出现一次的数字3
文章目錄
- 一:題目
- 二:解法
- 1)異或
- 2)詳解
一:題目
二:解法
1)異或
本題會使用到異或的方法,關于異或運算符及其在C語言中的使用詳見此文章。
2)詳解
第一步:因為異或是相同為0,相異為1,題目中說到,整個數組中只有兩個數出現了一次,其余全部數均出現兩次。所以把所有元素都進行異或操作,相同的元素異或為0,所以最終異或的結果一定是,那兩個不同元素進行運算結果。假設那兩個不同的元素為X1和X2,其結果一定=X1^X2。
第二步:這一步就應該要分離出X1和X2。這里舉例說明
int* singleNumber(int* nums, int numsSize, int* returnSize) {int ret=0;for(int i=0;i<numsSize;i++){ret^=nums[i];}//第一步:因為異或是<b>相同為0,相異為1</b>,題目中說到,整個數組中只有兩個數出現了一次,其余全部數均出現兩次。所以把所有元素都進行異或操作,相同的元素異或為0,所以最終異或的結果一定是,那兩個不同元素進行運算結果int m=0;while(m<32){if(ret & (1<<m))break;else++m;}//找出ret1的第m位為1int x1=0;int x2=0;for(int i=0;i<numsSize;i++){if(nums[i] & (1<<m)){x1 ^= nums[i];}else{x2 ^= nums[i];}} //找到第M位后,再次探查數組,如果某個數的第m位為,則為X1,反之則為X2int* retarr=(int*)malloc(sizeof(int)*2);retarr[0]=x1;retarr[1]=x2;*returnSize=2;return retarr;}總結
- 上一篇: 4-3:TCP协议之UDP协议
- 下一篇: 面试笔试排序算法