一个数组,一个数字出现一次,其他数字出现x次,求只出现一次的数字。做法很多,但对空间与时间度有要求的话,位运算是最方便的做法
如果x是2的话,仅仅异或运算就可以了,但如果更多次的话,则需要每一次位运算,每位置上的1次数达到x,就归0
这里需要有两点需要证明,①能得到只出现一次的数字,也符合交换律,②如何构建出来
①符合上述说明的仅仅是一个累加器,统计一的个数,并达到某个数字归零,等价与(a+b+c+d)%x,很明显abcd交换位置不能影响结果,又因为其他数字都出现x次,换句话说其他数字一定会被%x取消
②int a,b,c,d,e,f……若干个变量,X=变量个数=其他变量出现次数=计数器到达归零数字,
于是做出假设,这些变量中的二进制的某一固定位置,1的数量只能零和一,出现一次时候在第一个变量,出现两个时候在第二个变量,以此类推,最后一个直接归零
i是数组元素,a=(a^i)&(其他变量相互或运算,并结果取反),b=(b^i)&(其他变量相互或运算,并结果取反)……以此类推,假设数组元素i的二进制某一位为0不会变化变量表,如果为1的话,这个变量这个位置变零,下一个变量(如果存在)变1
标签:运算,计数器,数组,其他,出现,变量,数字 From: https://www.cnblogs.com/moyutinghua/p/16640758.html