粗糙的给出了分析,最近比较累,以后会改进的。
题目中包括三个小的问题,由简单到复杂:
1,如果只有一个出现一次,考察到异或的性质,就是如果同一个数字和自己异或的活结果为零,那么循环遍历一遍数组,将数组中的元素全部做异或运算,那么出现两次的数字全部异或掉了,得到的结果就是只出现一次的那个数字。
2,如果有两个只出现一次的数字,设定为a,b。也是应用异或,但是数组元素全部异或的结果x=a^b,因为a,b是不相同的数字,因此x肯定不为0。对于x,从低位到高位开始,找到第一个bit位为1的位置设定为第m位,这个第m位的bit肯定来自a或者来自b,不可能同时a,b的第m位(从低到高位)都为1。这样,就可以根据这个第m位就可以把数组分为两个部分,一组为第m位为0,一组为第m位为1.这样,就把问题分解成了求两个数组中只出现一次的数字了。下面首先给这部分的程序和实例分析:
- <span style="font-family:FangSong_GB2312;font-size:14px;">#include<stdio.h>
- int get_first_position(int num)
- { //从低位开始找到第一个位1的bit位
- int index=1;
- int i=0;
- while(i<32)
- {
- if((num&(1<<i))==(1<<i))
- break;
- else
- {
- index++;
- i++;
- }
- }
- return index;
- }
- int is_bit_one(int