出现了三次的时候,如果仍然从位运算入手,特征是什么?设那个唯一的数是x,特征是,按int型32位计,其中某一位假设x在该位上是0,则情况应该是该位的1出现的次数是3的倍数,而如果是1,则应该是出现3n + 1次的1,根据这个特征,来计算那个唯一的数据;
设三个int, one、two、three,这里出现一次为 0 1 两次未 1 0 三次为 1 1 这里的高位是存在two中,低位存在one中,根据不同状态去做操作;同时为1则清0. 再强调一下,这里one表示的每一位在低位的计数表示,two表示每一位在高位的计数表示;
public: int singleNumber(int A[], int n) { int one = 0, two = 0, three = 0; for (int i = 0; i < n; i++){ two |= one & A[i]; //be careful one ^= A[i]; three = one & two; one &= ~three; two &= ~three; } return one; }
Leetcode :: Single Number II,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u013195320/article/details/38391189