338. Counting Bits(计算小于n的各个数值对应的二进制1的个数)
思路:通过奇偶判断,if i是偶数,a[i]=a[i/2],if i是奇数,a[i]=a[i-1]+1。
class Solution { public: vector<int> countBits(int num) { vector<int>res(num+1, 0); for(int i=1;i<=num;i++) { if(i&1) res[i] = res[i-1]+1;//如果尾数为1,那么结果就是奇数,等于前一个值加1 else res[i] = res[i/2];//如果尾数为0,那么就是偶数,等于他一半的值 } return res; } };
136. Single Number(只有一个元素出现1次,其他出现2次,寻找只出现一次的数值)
思路:异或 解决,异或性质: x^x=0,x^0=x
class Solution { public: int singleNumber(vector<int>& nums) { int n=nums.size(); int res=nums[0]; for (int i=1;i<n;i++){ res=res^nums[i]; } return res; } };
137. Single Number II (只有一个元素出现1次,其他出现3次,寻找只出现一次的数值);
思路:按照位运算,每个位置是上1的个数为3,则变0
class Solution { public: int singleNumber(vector<int>& nums) { int n = nums.size(),answer=0; for (int j = 0; j < 32; j++) { int a = 1<<j,count=0;//count 记录每个位置上1的个数 for (int i = 0; i < n; i++) { if (a&nums[i]) count++;//统计转化为二进制之后,在a的位置上1的个数 } if (count % 3 != 0)//如果每个位置上的1不为3,则最后的数字中,这个位置中一定是1 answer |= a; } return answer; } };
260. Single Number III(有两个元素出现1次,其他出现2次,寻找两个出现一次的数值);
思路:整体异或结果,而后在这个结果中某个位置为1的位置,进而分割成两个部分,分别异或,者可得到结果
class Solution { public: vector<int> singleNumber(vector<int>& nums) { int n = nums.size(); vector<int> vec; int res=0; for (int i = 0; i < n; i++) { res ^= nums[i]; } int index = 0;//记录异或的结果第一个为1的位置,0表示第一个位置为1 for (int i = 0; i < 32; i++) { if (res & 1 == 1) break; index++; res = res >> 1; } int num1=0, num2 = 0; for (int i = 0; i < n; i++) { if ((nums[i] >> index) & 1 == 1)//以index位置将述组分为两段异或 num1 ^= nums[i]; else num2 ^= nums[i]; } vec.push_back(num1); vec.push_back(num2); return vec; } };