zoukankan      html  css  js  c++  java
  • 不使用判断语句求一组数中的奇数/偶数个数

      这题是我无聊的时候在微信公众号的一篇文章中看到的,题目是不使用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个奇数
    ", 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;
    }
    

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

  • 相关阅读:
    推荐一套 Spring Boot 快速开发框架,接私活、练手必备!
    C# 三种字节数组(byte[])拼接的性能对比测试
    C#//字节数组转16进制字符串
    C# 16进制与字符串、字节数组之间的转换
    linux脚本学习
    ubuntu12.04纪事
    linux常用命令
    linshi
    2022壬寅年天干四化
    码农们来一起讨论下数据库设计....
  • 原文地址:https://www.cnblogs.com/darkchii/p/8977069.html
Copyright © 2011-2022 走看看