这题是我无聊的时候在微信公众号上看到的,感觉挺有意思的,于是想了想,下面是自己实现的算法:
#include<stdio.h> #define MASK 0x1 int ComputeOddNumbers(int * nums, int arr_size) { int count = 0; for (int i = 0; i < arr_size; i++) { int bit = (MASK | nums[i]); count += bit - nums[i]; } return arr_size - count; // 返回奇数个数 } int main { int array[] = {1,4,5,0,9,2,-1,6,8,3}, *nums = array; int size = (int)sizeof(array)/sizeof(int); printf("共有%d个奇数\n", ComputeOddNumbers(nums, size)); return 0; }
这里利用了位或处理奇数/偶数,奇数与0x1位或是数本身,偶数则为本身+1。于是就很简单了。
公众号中给出的解决方法:
int Solution(std::vector<int> & nums) { int count = 0; for(auto n : nums) { count += n%2; } return count; }
巧妙的运用了奇数与偶数的特点。