剑指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 面试题17:打印从1到最大的n位数 Java代码实现

题目:输入数字n,按顺序打印从1到最大的n位的十进制数。比如,输入3,则打印出1、2、3一直到999。 这个题目好像很简单,求出最大的n位数,然后for循环打印就好了。但是Java中int类型的范...

剑指offer面试题11 数值的整数次方的Java代码实现

数值的整数次方的Java代码实现 剑指offer这本书不错。以下是我对这道题的Java代码实现 /** * 剑指offer中面试题11:数值的整数次方double power(double b...

剑指Offer 面试题24:反转链表 Java代码实现

题目:定义一函数,输入链表的头结点,反转该链表并输出反转后的链表头结点。 因为在反转一个节点时,需要把该节点的指针域指向其前一节点,这样就无法访问其后续节点。所以,需要有三个指针分别指向当前节点...

剑指Offer 面试题19:正则表达式匹配 Java代码实现

题目:正则表达式匹配 请实现一个函数用来匹配包含'.'和'*'的正则表达式。字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次) 主要思想就是字符的第...

剑指Offer 面试题18:删除链表节点 Java代码实现

题目:在O(1)时间内删除链表节点。 给定单向链表头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。 这儿采用有头结点的单链表结构,头结点的存在是为了方便操作,针对单链表来说,如果带头...

剑指Offer 面试题23:链表中环的入口节点 Java代码实现

题目描述 一个链表中包含环,请找出该链表的环的入口结点。 这题又用到了一快一慢两个指针的方法,快指针一次走两步慢指针一次走一步。可以证明,若存在环路,则这两个指针一定会在环路中某个地方相遇。这也是检...

剑指Offer 面试题22:链表中倒数第k个节点 Java代码实现

题目 输入一个链表,输出该链表中倒数第k个结点。 这个问题可以用两个链表指针来实现,这个方法在单向链表的问题中经常使用。具体而言,就是一快一慢两个指针,快指针先走(k-1)步,然后两个指针同时走,当...

剑指offer--面试题10:二进制中1的个数--Java实现

题目描述: 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数,例如把9表示成二进制是1001,有两位是1。因此如果输入9,该函数输出2。思路: 考察位运算,首先想到的是每一位分别与1做与...

剑指offer 面试题 (二进制中 1 的个数)(4)

# 面试题:  求一个整数二进制中 1 的个数? /* 题目:  请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。 例如把 9 表示为二进制是 1001, 有两个 1;因此,...
  • bitboss
  • bitboss
  • 2016年05月10日 16:12
  • 282

剑指Offer面试题10二进制中1的个数(位运算)附带一个进制转换题

面试题10:二进制中1的个数 实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如9的二进制是1001,则输出2。 位运算相关知识:位运算共5种,与(&)是同时为1才为1,或(|)是有一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指Offer 面试题15:二进制中1的个数 Java代码实现
举报原因:
原因补充:

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