剑指Offer 面试题15:二进制中1的个数 Java代码实现

原创 2017年11月08日 21:44:18

剑指Offer 面试题15:二进制中1的个数

题目:实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,9的二进制是1001,有两位是1,那么输入9,函数输出2。


看完题目我就想到了Java中Integer类中的bitCount()方法,记得在leetcode上就是这么偷懒完成accepted的,哈哈!正确的解题思路是让1和该数的二进制表示的每一位相与,若不为零则表示该位是1。遍历二进制表示的每一位并统计结果不为0的次数,就是二进制表示中的1的个数了。容易想到,将输入的数字与1相与,然后将数字一直右移,继续相与。书中说,这样会引起死循环,其实这只是条件判断的区别。比如,输入int类型,那在Java中,就是32位存储的,循环判断32次写死了,就没有问题了;另一种是不右移数字,而是将1一直坐移。下面Java代码就是采用将1左移实现的,其实右移数字也可以。


第一种解法:

public static int numberOfOne(int n){
		int count=0;
		int flag=1;
		for(int i=1;i<=32;i++){
			if((n&flag)!=0)
				count++;
			flag=flag<<1;
		}
		return count;
	}

采用右移数字也行,就像上面代码中for循环直接写死32次,而不是采用书中用while判断是否为0!


第二种解法:

该解法基于这样一个事实:把一个整数减1,在和原数相与,会把改整数二进制表示中的最右边的1变成0。

Java代码如下:

public static int numberOfOne2(int n){
		int count=0;
		while(n!=0){
			count++;
			n=n&(n-1);
		}
		return count;
	}

只要数字不为0,就说明二进制表示中还存在1,就进行减一相与的操作,能进行这样的操作的次数就是1的个数。这种方法循环次数就是1的个数,循环次数比第一种方法少了。


采用Integer类的bitCount()来检验算法对不对,测试代码如下:

public static void main(String[] args) {
		int[] xArr={0,9,15,-1,-15};
		int [] result=new int[xArr.length];
		int [] result2=new int[xArr.length];
		int [] result3=new int[xArr.length];
		for(int i=0;i<xArr.length;i++){
			result[i]=numberOfOne(xArr[i]);
			result2[i]=Integer.bitCount(xArr[i]);
			result3[i]=numberOfOne2(xArr[i]);
		}
		String s1=Arrays.toString(result);
		String s2=Arrays.toString(result2);
		String s3=Arrays.toString(result3);
		System.out.println("方法1结果="+s1+"\n内置API结果="+s2+"\n"+"方法2结果="+s3);
	}

输出结果:

方法1结果=[0, 2, 4, 32, 29]
内置API结果=[0, 2, 4, 32, 29]
方法2结果=[0, 2, 4, 32, 29]

版权声明:本文为博主原创文章,未经博主允许不得转载。

剑指Offer面试题10(Java版):二进制中的1的个数

题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2. 1、可能引起死循环的解法 这是一道很基本的考察二进制和...
  • jsqfengbao
  • jsqfengbao
  • 2015年07月30日 08:17
  • 2013

【剑指offer】二进制中1的个数

剑指offer上的第10题,在九度OJ上测试通过。 时间限制:1 秒内存限制:128 兆 题目描述: 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 输入: 输入可能包含...
  • mmc_maodun
  • mmc_maodun
  • 2014年05月10日 08:32
  • 3041

剑指offer-10-Python实现(二进制中1的个数)

题目内容:解答思路: 把一个整数减去1,再和原来的整数做位与运算,会把该整数最右边一个1变成0.也就是说,一个整数的二进制有多少个1,就可以完成多少次这样的操作。可以写出代码:def func(n)...
  • jackmcgradylee
  • jackmcgradylee
  • 2017年09月06日 21:46
  • 68

剑指offer(11):二进制中1的个数

题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。比如输入9,9的二进制表示是1001,1的个数是2,所以输出2。...
  • u011080472
  • u011080472
  • 2016年04月25日 12:24
  • 257

二进制中1的个数[剑指offer]之python实现

题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。题目链接# -*- coding:utf-8 -*- class Solution: def NumberOf1(sel...
  • huaxixidongbeishida
  • huaxixidongbeishida
  • 2016年10月16日 21:02
  • 1216

24. 微软面试题:整数的二进制表示中1的个数

题目:输入一个整数,求该整数的二进制表达中有多少个1。 例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 分析: 使用移位操作,来实现。 具体实现如下: #i...
  • hhh3h
  • hhh3h
  • 2014年03月13日 23:01
  • 813

剑指offer 面试题30:最小的K个数(topK问题) 题解

剑指offer 面试题30:最小的K个数 题目: 输入n个整数,找出其中最小的k个数。例如:例如输入4 、5 、1、6、2、7、3 、8 这8 个数字,则最小的4 个数字是1 、2、3 、4 提...
  • yanglr2010
  • yanglr2010
  • 2016年05月04日 22:57
  • 1318

关于Java的一道题:"求二进制数中1的个数"的解法整理

package com.accp; /**  * 求二进制数中1的个数  *  * @author Administrator  *  */ public class BinaryConversi...
  • u011659172
  • u011659172
  • 2013年12月04日 22:16
  • 2714

java 判断整数二进制中1的个数

题目:请实现一个函数,输入一个整数,输出该数二进制中1的个数。解法1:考虑到输入的整数可能是负数,所以不能使用右移运算,这里可以采取左移运算。这个解法中循环的次数等于整数二进制的位数。比如java i...
  • diu_brother
  • diu_brother
  • 2016年03月20日 22:55
  • 2797

Java实现二进制中1的个数

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示
  • u014282557
  • u014282557
  • 2017年06月04日 17:06
  • 770
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指Offer 面试题15:二进制中1的个数 Java代码实现
举报原因:
原因补充:

(最多只允许输入30个字)