题意
数组中除了一个数出现过一次,其余数都出现了三次。找出这个数。
题解
这里用最简单的基于统计的方法。即出现过三次的数,其统计结果的每个位置上的数对3取余则为要找那个数相应位置的二进制值。
代码
class Solution {public:int singleNumber(vector<int>& nums) {//建立一个长度为32的数组,以便能存下数据范围内的每个数的二进制位情况vector<int> bits(32, 0);int i;//首先对所有数字的每一位二进制进行统计for (int n : nums) {i = 0;while (n) {bits[i++] += n & 1;n >>= 1;}}//对每一个位置进行对3取余,得到的结果就是要找的数的二进制表示,再转换成数字就行了int res = 0;//从高位开始,这样才能逐渐把高位的值移动到对应的位置for (int i = 31; i >= 0; i--) {res <<= 1;res += bits[i] % 3;}return res;}};
