关闭

【剑指offer】面试题10: 二进制中1的个数

标签: 面试题二进制
298人阅读 评论(0) 收藏 举报
分类:

题目

实现一个函数,输入一个整数,输出该数二进制表示中1的个数。
例如9的二进制表示为1001,输入9,输出的结果是2.

其实自己来说并不太喜欢这种二进制游戏,但是也是自己的弱项,还是跟着书上分析一下。

首先,数字在计算机内部存储本身就是二进制,我们在做运算的时候,不用傻傻的写一个函数将十进制转换成二进制了。

右移,可能导致死循环(右移补符号位)

int NumOf1(int n) {
    int cnt = 0;
    while(n) {
        if (n & 1)  cnt++;
        n = n >> 1;
    }
    return cnt;
}

转换思路,n不变,flag左移没有符号位的限制,由于是int类型的n,flag左移31次

int NumOf1(int n) {
    int cnt = 0;
    int flag = 1;
    for (int i = 0; i < 32; i ++) {
        if (flag & n)   cnt++;
        flag = flag << 1;
    }
    return cnt;
}

取巧的解法:
一个数减1之后,最右边的1变为0,最右边1之后的0全部变为1,所以n和n-1做与运算,如果n中有1,结果就不为0。同时结果也变为去掉n中最右边的1的数。

int NumOf1(int n) {
    int cnt = 0;
    while(n) {
        cnt++;
        n = n & n-1;
    }
    return cnt;
}

神思路,虽然我觉得临场不可能创造出这么好的算法,但是有个印象,知道这样的题目,在特定的情况下有这么一种解法,也算是扩宽思路。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

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

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

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

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

剑指offer—二进制中1的个数

面试题10:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。首先对于二进制1的求解,在这里...
  • qq_26768741
  • qq_26768741
  • 2016-05-09 23:56
  • 3078

【剑指Offer学习】【所有面试题汇总】

剑指Offer学习  剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退。只有不断地学习才能跟上时候,跟得上技术的潮流!目录第...
  • DERRANTCM
  • DERRANTCM
  • 2015-07-15 07:26
  • 18425

剑指offer之面试题12-1:大整数加减

题目描述定义一个函数,在该函数中可以实现任意两个整数的加法。由于没有限定输入两个数的大小范围,我们也要把它当做大数问题来处理思路: s1:用两个字符数组分别来保存两个数 case1:两个数一正一负...
  • sushauai
  • sushauai
  • 2016-04-21 19:34
  • 537

剑指offer面试题(一)

剑指offer是一本讲了五十多道经典面试题的书,从今天开始一天一道,希望自己坚持下去,加油!
  • qq_34328833
  • qq_34328833
  • 2016-05-08 16:57
  • 972

剑指offer面试题14

面试题14:调整数组顺序使奇数位于偶数t
  • ahuang1900
  • ahuang1900
  • 2014-05-29 17:29
  • 399

剑指offer--面试题22:栈的压入、弹出序列--Java实现

题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列。假如压入栈的所有数字均不相同。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该栈序列...
  • u012289407
  • u012289407
  • 2015-06-19 21:12
  • 433

剑指offer面试题28:字符串的排列 Java实现

题目: 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba. 算法分析: 我们求...
  • gg543012991
  • gg543012991
  • 2016-09-14 19:42
  • 596

剑指offer--面试题28:字符串的排列--Java实现

题目描述:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。解题思路:我们求整个字符...
  • u012289407
  • u012289407
  • 2015-06-28 16:55
  • 1563
    个人资料
    • 访问:68653次
    • 积分:1760
    • 等级:
    • 排名:千里之外
    • 原创:98篇
    • 转载:24篇
    • 译文:0篇
    • 评论:16条
    联系方式

    邮箱:geek00021@gmail.com

    最新评论