首页 > 其他分享 >剑指offer第二版-15_2二进制中1的个数

剑指offer第二版-15_2二进制中1的个数

时间:2022-11-01 11:38:02浏览次数:39  
标签:count binary 15 offer 二进制 整数 int return


/**
* 实现一个函数,输入一个int型整数,输出该数字在计算机中二进制表示形式的1的个数。
* 例如9->1001,输出2;-3->11111111111111111111111111111101,输出31。
* <p>
* 思路:这道题主要考察二进制和位运算,总体思路就是想判断二进制数字的最后一位是不是1,接着将输入整数右移一位,再依次判断
* 但是这样的话会有一个问题是,如果输入是负数,会一直陷入死循环
* 为了避免死循环,我们可以不右移数字n,首先把n和1做与运算,判断最低位是不是1,然后把1左移一位,再和n做与运算,就能判断n的次低位是不是1
* 这样的话,循环次数等于整数二进制的位数,32位的整数需要循环32次,下面的算法中,整数二进制有几个1就只需要循环几次
* <p>
* 我们先来分析把一个数字减去一的情况,如果一个整数不等于0,那么该整数的二进制表示至少有一位是1.先假设这个数的最右面一位是1
* 那么,减去1时,最后一位编程了0,其他位不变。也就是最后一位相当于做了取反操作,由1变成了0.
* 接下来假设最后一位不是1,是0的情况。如果该整数的二进制表示中,最右边的1位于第m位。那么,减去1时,第m位由1变成了0,而第m位之后的所有0都变成了1,左边的数字则保持不变
* 比如1100减一变成了1011
* 在前面两种情况中,我们发现,把一个整数减去1,都是把最右面的1变成0,。如果她的右边还有0,则所有的0变成了1。接下来我们把一个整数和它减去1的结果做位于运算,相当于把他最右边的1变成0。
* 还是以1100为例,它减去1的结果是1011,两个数字做位运算,结果是1000
* <p>
* 经过上面的分析,得出结论:把一个整数减去一,在和原来的数进行位与运算,会把该整数最右边的1变成0,那么,一个整数的二进制表示有几个1就可以进行几次这样的操作
*
* @author VicterTian
* @version V1.0
* @Date 2019/2/8
*/
public class P100_NumberOf1InBinary {
/**
* 遇到负数无法解决
*
* @param n
* @return
*/
public int numberOfOne1(int n) {
int count = 0;
while (n != 0) {
if ((n & 1) != 0) {
count++;
}
n = n >> 1;
}
return count;
}

/**
* @param n
* @return
*/
public int numberOfOne2(int n) {
int count = 0;
int flag = 1;
while (flag != 0) {
if ((n & flag) != 0) {
count++;
}
flag = flag << 1;
}
return count;
}


/**
* @param n
* @return
*/
public int numberOfOne3(int n) {
int count = 0;
while (n != 0) {
n = n & (n - 1);
count++;
}
return count;
}


public static void main(String[] args) {
P100_NumberOf1InBinary binary = new P100_NumberOf1InBinary();
System.out.println("binary.numberOfOne1(2) = " + binary.numberOfOne1(2));
// 遇到负数开始死循环
// System.out.println("binary.numberOfOne1(-2) = " + binary.numberOfOne1(-2));

System.out.println("binary.numberOfOne2(2) = " + binary.numberOfOne2(2));
System.out.println("binary.numberOfOne2(-2) = " + binary.numberOfOne2(-2));

System.out.println("binary.numberOfOne3(2) = " + binary.numberOfOne3(7));
System.out.println("binary.numberOfOne3(-2) = " + binary.numberOfOne3(-7));
}
}


标签:count,binary,15,offer,二进制,整数,int,return
From: https://blog.51cto.com/u_13351110/5812905

相关文章

  • 剑指offer第二版-17_1任意两个整数的加法
    /***定义一个函数,在该函数中可以实现任意两个整数的加法*<p>*对于这道题,由于没有限定输入的两个数的范围,所以要按照大数问题来进行处理*由于题目要求是要实现任意两......
  • 剑指offer第二版-16数值的整数次方
    /***数值的整数次方*<p>*实现函数doublepower(doublebase,intexponent),求base的exponent次方。不能使用库函数,不需要考虑大数问题。*可能我们的第一想法永远是利用......
  • 剑指offer第二版-17打印从1到最大的n位数
    /***打印从1到最大的n位数*<p>*如输入2,打印1,2......98,99*注意:本题需要考虑大数问题,用字符串解决大数问题是最好的解决方案之一*用字符串表示数字的时候,最直观的......
  • 剑指offer——数据流中的中位数
    题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数......
  • 剑指offer——整数中1出现的次数
    题目描述:求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙......
  • 剑指offer——数字在排序数组中出现的次数
    题目描述:统计给定数字k在排序数组中出现的次数思路1:最容易想到但是效率不高的一个方法就是遍历整个数组,统计k出现的次数(for循环就能解决,不赘述)思路2:由于题目给出是排序......
  • 剑指offer——二叉树的深度
    题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路1:按照深度优先遍历,设置一个全局变量ma......
  • 剑指offer——不用加减乘除做加法
    题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:分三步1)不考虑进位,只是对两个数进行按位异或(二进制异或就是对应位相加)2)统计进......
  • 剑指offer——圆圈中最后剩下的数字
    题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋......
  • 剑指offer——求1+2+3+...+n的和
    题目描述:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)思路1:使用构造函数,创建n个类对象,利用构造函数进行求和计算clas......