题解 | #查找输入整数二进制中1的个数#

查找输入整数二进制中1的个数

http://www.nowcoder.com/practice/1b46eb4cf3fa49b9965ac3c2c1caf5ad

描述

题目描述

输入一个正整数,计算它在二进制下的1的个数。

示例

输入:5
输出:2
说明:5的二进制表示是101,有2个1   

知识点:位运算

难度:⭐⭐


题解

方法一:移位统计

图解

image-20211209125539386

解题思路:

通过二进制的特性,每次进行最低为和1进行与运算,之后不断左移,并且最低位忽略,继续统计最低位是1还是0

算法流程

  • 对num进行最多32次运算的for循环
  • 最低为的位运算,1 & 1 == 1, 0 & 1 == 0
  • 不断左移,即最低位忽略,接下来继续统计最低位

Java 版本代码如下:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
        	int num = scanner.nextInt();
        	System.out.println(solution(num));
        }
    }

    private static int solution(int num) {
        int res = 0;
        // 题目要求1<= num <= 2^32-1, 即二进制最多32位
        for(int i = 0; i < 32; i++) {
            // 位运算,1 & 1 == 1, 0 & 1 == 0
            if((num & 1) == 1) {
                res++;
            }
            // 左移,即最低位忽略,接下来继续统计最低位
            num = num >> 1;
        }
        return res;
    }
}

复杂度分析

时间复杂度O(1)O(1),进行最多32次运算,属于常数级别的时间复杂度

空间复杂度O(1)O(1),没有开辟额外空间

方法二:二进制判断

解题思路

转换位二进制后判断字符为1的个数

算法流程

  • 通过库函数将十进制数字转为字符串形式的二进制格式
  • 判断字符为1的个数即可

Java 版本代码如下:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
        	int num = scanner.nextInt();
        	System.out.println(solution(num));
        }
    }

    private static int solution(int num) {
        int res = 0;
        String bin = Integer.toBinaryString(num);
        for(char c : bin.toCharArray()) {
            if(c == '1') {
                res++;
            }
        }
        return res;
    }
}

复杂度分析

时间复杂度O(n)O(n),n为输入数字的二进制位长度,需要遍历转换二进制后的每个字符

空间复杂度O(1)O(1),没有开辟额外空间

全部评论

相关推荐

2025-11-28 11:13
门头沟学院 游戏策划
真顶不住了兄弟们…11&nbsp;月底了,秋招投了仨月,还是&nbsp;0offer,纯纯陪跑选手。从&nbsp;8&nbsp;月底就开始瞎忙活,前俩月还会为了面试挂掉崩溃到睡不着,现在心里早就没波澜了,跟一潭死水似的。不知道从啥时候起,也不焦虑了,就剩摆烂和逃避现实&nbsp;——&nbsp;简历不想改,面试题不想刷,连打开招聘软件的劲儿都没了。中间撑着我往下走的,其实是那点自我安慰:每次收到面试邀约,都告诉自己&nbsp;“挂了也没事,就当练手”,好歹能趁着准备的功夫捋捋项目逻辑,优化下面试话术,只要有进步,总能撞上一个机会。说实话也确实有点变化,从一开始一面就凉,到后来能冲进二面、三面,我还以为事情在往好的方向走…&nbsp;结果后面零星几个面试,又是一面挂、二面挂,无限循环。原来我以为的&nbsp;“进步”,根本就是自我感动的幻觉,说白了就是原地踏步。我到底收获啥了?面试还是那么拉胯,花了无数时间准备材料、练话术、做&nbsp;PPT,到最后连展示的机会都没有,每次都是不明不白被拒,纯属瞎忙活。现在彻底没面试邀约了,希望没了,动力也泄了,只剩下迷茫、麻木,还有点面试&nbsp;PTSD——&nbsp;一想到要面试就犯怵。我承认自己可能不够努力,但每次有机会的时候,我是真的拼尽全力去准备了啊。我还想再挣扎一下,还不想就这么放弃,但现在是真的没头绪了…&nbsp;到底还能做点啥,才能把这秋招的烂摊子盘活啊?
牛客77447303...:老哥没事,我去年双非硕没找到,今年毕业后这个月才接着找,半个月就找到了,给我的感觉就是企业都是需要尽快入职的(至少小企业是这样)。所以不要慌,毕业后社招也许能更快找到工作。
十一月总结
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务