• lintcode :Count 1 in Binary 二进制中有多少个1


    题目:

    二进制中有多少个1

    49% 通过 计算在一个 32 位的整数的二进制表式中有多少个 1.

    样例

    给定 32 (100000),返回 1

    给定 5 (101),返回 2

    给定 1023 (111111111),返回 9

    解题:

    Java程序:

    public class Solution {
        /**
         * @param num: an integer
         * @return: an integer, the number of ones in num
         */
        public int countOnes(int num) {
            // write your code here
            return countOnes1(num); //总耗时: 1201 ms
            // return countOnes2(num); //总耗时: 1185 ms
            // return countOnes3(num); // 总耗时: 1215 ms
        }
        public int countOnes1(int num){
            int count = 0;
            while(num!=0){
                if(num%2==1)
                    count++;
                num=num/2;
            }
            return count;
        }
        public int countOnes2(int num){
            int count = 0;
            while(num!=0){
                count +=num&0x01;
                num = num>>1;
            }
            return count;
        }
        public int countOnes3(int num){
            int count = 0;
            while(num!=0){
                num = num & (num-1);
                count++;
            }
            return count;
        }
    };
    View Code

    上面程序中有三种方法,都来自编程之美
    第一种:

    原数除以2后,数字将减少一个0

    若余数是1则,减少一个1,记录1的个数

    若余数是0则,减少一个0,记录0的个数

    第二种:

    利用位运算

    0&1 =0

    1&1 =1

    这个32位数与0000 0001 与运算的值是1,记录1的个数

    即:count += num & 0x01

    num右移一位

    num=num>>1

    第三种:

      int count = 0;
            while(num!=0){
                num = num & (num-1);
                count++;
            }
            return count;

    好机智的方法,时间复杂度是O(M),M是num中1的个数

    Python程序:

    class Solution:
        # @param num: an integer
        # @return: an integer, the number of ones in num
        def countOnes(self, num):
            # write your code here
            # return self.countOnes1(num) # 387 ms
            # return self.countOnes2(num) # 418 ms
            return self.countOnes3(num) # 398 ms
    
        def countOnes1(self,num):
            count = 0
            while num!=0:
                if num%2==1:
                    count+=1
                num/=2
            return count
            
        def countOnes2(self,num):
            count = 0
            while num!=0:
                count += num&0x01
                num = num>>1
            return count
        
        def countOnes3(self,num):
            count = 0
            while num!=0:
                num = num & (num-1)
                count+=1
            return count
    View Code
  • 相关阅读:
    【YBTOJ】【Luogu P2605】[ZJOI2010]基站选址
    【CodeForces 261D】Maxim and Increasing Subsequence
    【Luogu P4140】奇数国
    【YBTOJ】【Luogu P6474】[NOI Online #2 入门组] 荆轲刺秦王
    【YBTOJ】【Luogu P4667】[BalticOI 2011 Day1]Switch the Lamp On
    Tools分类随笔链接整理贴(不定期更新)
    Vs2012安装介绍
    VC 修改对话框默认类名
    扫雷小游戏_通过爆破手段强制胜利
    C++ STL(十)算法
  • 原文地址:https://www.cnblogs.com/theskulls/p/4867521.html
Copyright © 2020-2023  润新知