Given an array of integers, every element appears threetimes except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
这一次数字重复出现的次数是3了,不像是 single number中的2,不能采取直接异或的办法了。难度上升了一点。其实只要这么想就行了,把所有的数直接看成二进制形式,如果一个数出现了3次,其每一个二进制位1就必须重复出现3次,而3%3=0。int数是4字节,对应32位,只要记录所有数二进制位出现的次数模三,就会得出那个特殊的数二进制位1出现的位置,这样就会得出那个特殊的数是谁。
按照上述思路写出代码:
class Solution { public: int singleNumber(int A[], int n) { int bitnum[32]={0}; int res=0; for(int i=0; i<32; i++){//外循环对应32个二进制位 for(int j=0; j<n; j++){ bitnum[i]+=(A[j]>>i)&1;//记录对应位置二进制位出现的次数 } res|=(bitnum[i]%3)<<i;//还原特殊数第i+1个二进制位 } return res; } };
>> 和 << 代表右移和左移。例如:
a=a>>2;将a对应二进制数右移2位
a=a<<2;将a对应二进制数左移两位
请注意!(a>>i)&1取得的是a从右向左数第i个二进制位
扩展:
如果重复出现的数都出现了k次,那只需将上面的模3改为模k即可!
时间: 2024-10-11 03:49:26