算法的学习笔记——二进制中 1 的个数(牛客JZ15)
【摘要】 在计算机科学中,二进制是计算和存储数据的基础。理解二进制中的基本运算有助于我们解决各种编程问题。一个经典的问题是:给定一个整数,如何快速计算该整数的二进制表示中1的个数。
😀前言
在计算机科学中,二进制是计算和存储数据的基础。理解二进制中的基本运算有助于我们解决各种编程问题。一个经典的问题是:给定一个整数,如何快速计算该整数的二进制表示中1的个数。
😊二进制中 1 的个数
题目链接
题目描述
输入一个整数,输出该数二进制表示中 1 的个数。
🤩描述
输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
数据范围:−2^31^<=n<=2^31^−1
即范围为:−2147483648<=n<=2147483647
示例1
输入:10
返回值:2
说明:十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1
示例2
输入:-1
返回值:32
说明:负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1
🤩解题思路
n&(n-1) 位运算可以将 n 的位级表示中最低的那一位 1 设置为 0。不断将 1 设置为 0,直到 n 为 0。时间复杂度:O(M),其中 M 表示 1 的个数。
public int NumberOf1(int n) {
int cnt = 0;
while (n != 0) {
cnt++;
n &= (n - 1);
}
return cnt;
}
😄总结
通过位运算n & (n - 1),我们能够以O(M)的时间复杂度(其中M为二进制表示中1的个数)高效计算一个整数的二进制表示中1的个数。这种方法简洁且快速,尤其适用于处理大范围的整数。通过理解和应用这一技巧,不仅能解决类似的面试问题,还能加深我们对位运算的掌握,提高编程能力。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)