C/C++ - 不使用判断语句求一组数中的奇数/偶数个数

  这题是我无聊的时候在微信公众号上看到的,感觉挺有意思的,于是想了想,下面是自己实现的算法:

#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;
}

  巧妙的运用了奇数与偶数的特点。

猜你喜欢

转载自www.cnblogs.com/darkchii/p/8977069.html