这题是我无聊的时候在微信公众号的一篇文章中看到的,题目是不使用if(或者三元运算,switch方法)如何求出一组数中的奇数个数。
感觉挺有意思的,于是想了想,下面是自己实现的算法:
#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。于是就很简单了。
使用按位与(&)会更简洁一些:
#include <iostream>
#include <vector>
#define MASK 1
int OddNumbers(std::vector<int> nums)
{
int count = 0;
for (auto n : nums)
count += (n & MASK);
return count;
}
int main()
{
std::vector<int> nums = { 1,2,3,4,5,6 };
std::cout << OddNumbers(nums) << std::endl;
return 0;
}
公众号文章中给出的解决方法:
int Solution(std::vector<int> & nums)
{
int count = 0;
for(auto n : nums)
{
count += n%2;
}
return count;
}
巧妙的运用了奇数与偶数的特点。