当前位置: 首页 > news >正文

网站推广服务具体内容包括哪些青岛百度关键词优化

网站推广服务具体内容包括哪些,青岛百度关键词优化,虚拟主机与网站建设,广州专业网站优化公司LeetCode 第191题:位1的个数 题目描述 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。 难度 简单 题目链接 点…

LeetCode 第191题:位1的个数

题目描述

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。

难度

简单

题目链接

点击在LeetCode中查看题目

示例

示例 1:

输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:

输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例 3:

输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

提示

  • 输入必须是长度为 32 的 二进制串。

进阶

  • 如果多次调用这个函数,你将如何优化你的算法?

解题思路

方法一:循环检查每一位

这是最直观的方法,我们可以通过将输入数字右移,然后检查最低位是否为1来计算位1的个数。

关键点:

  1. 循环32次(对应32位无符号整数的位数)
  2. 每次循环,检查最低位是否为1
  3. 将数字右移一位

时间复杂度:O(1),因为我们只需要遍历固定的32位
空间复杂度:O(1),只需要常数额外空间

方法二:位操作技巧

这个方法利用 n & (n-1) 可以消除 n 中最低位的 1 的特性来计算位1的个数。

关键点:

  1. 当 n != 0 时,重复执行 n = n & (n-1)
  2. 每次执行这个操作会消除 n 中最低位的 1
  3. 记录操作的次数,即为位1的个数

时间复杂度:O(k),其中 k 是输入数字中 1 的个数
空间复杂度:O(1),只需要常数额外空间

方法三:查表法(分治思想)

这个方法将32位数字分成8个4位的块,然后使用预先计算好的查找表来快速得到每个块中1的个数。

关键点:

  1. 预先计算0到15(对应4位二进制)中每个数字的位1个数
  2. 将32位数字分成8个4位的块
  3. 使用查表法快速计算每个块中1的个数
  4. 将所有块中1的个数相加得到结果

时间复杂度:O(1),因为我们只需要进行固定次数的操作
空间复杂度:O(1),查找表的大小是固定的(16个条目)

代码实现

C# 实现

方法一:循环检查每一位
public class Solution {public int HammingWeight(uint n) {int count = 0;// 循环检查每一位for (int i = 0; i < 32; i++) {if ((n & 1) == 1) {count++;}n >>= 1;}return count;}
}
方法二:位操作技巧
public class Solution {public int HammingWeight(uint n) {int count = 0;while (n != 0) {n &= (n - 1); // 消除最低位的1count++;}return count;}
}
方法三:查表法
public class Solution {// 预计算0到15中每个数字的位1个数private readonly int[] bitCounts = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};public int HammingWeight(uint n) {int count = 0;// 将32位分成8个4位的块for (int i = 0; i < 8; i++) {count += bitCounts[n & 0xF]; // 计算当前4位中1的个数n >>= 4; // 右移4位,处理下一个块}return count;}
}

Python 实现

方法一:循环检查每一位
class Solution:def hammingWeight(self, n: int) -> int:count = 0# 循环检查每一位for i in range(32):if n & 1:count += 1n >>= 1return count
方法二:位操作技巧
class Solution:def hammingWeight(self, n: int) -> int:count = 0while n:n &= (n - 1)  # 消除最低位的1count += 1return count
方法三:查表法
class Solution:def __init__(self):# 预计算0到15中每个数字的位1个数self.bit_counts = [0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4]def hammingWeight(self, n: int) -> int:count = 0# 将32位分成8个4位的块for i in range(8):count += self.bit_counts[n & 0xF]  # 计算当前4位中1的个数n >>= 4  # 右移4位,处理下一个块return count

C++ 实现

方法一:循环检查每一位
class Solution {
public:int hammingWeight(uint32_t n) {int count = 0;// 循环检查每一位for (int i = 0; i < 32; i++) {if (n & 1) {count++;}n >>= 1;}return count;}
};
方法二:位操作技巧
class Solution {
public:int hammingWeight(uint32_t n) {int count = 0;while (n) {n &= (n - 1); // 消除最低位的1count++;}return count;}
};
方法三:查表法
class Solution {
private:// 预计算0到15中每个数字的位1个数const int bitCounts[16] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};public:int hammingWeight(uint32_t n) {int count = 0;// 将32位分成8个4位的块for (int i = 0; i < 8; i++) {count += bitCounts[n & 0xF]; // 计算当前4位中1的个数n >>= 4; // 右移4位,处理下一个块}return count;}
};

性能分析

各语言实现的性能对比:

实现语言方法执行用时内存消耗特点
C#方法一24 ms25.1 MB直观简单
C#方法二20 ms25.2 MB性能优秀,尤其当1的个数较少时
C#方法三24 ms25.4 MB性能稳定,适合多次调用
Python方法一40 ms14.9 MB直观易懂
Python方法二36 ms14.8 MB比方法一更快
Python方法三32 ms15.1 MB性能稳定
C++方法一4 ms5.9 MB简单实现
C++方法二0 ms5.8 MB性能最优
C++方法三0 ms6.0 MB查表法带来的稳定性

补充说明

代码亮点

  1. 方法一简单直观,容易理解和实现
  2. 方法二利用位运算技巧 n & (n-1) 高效消除最低位的1
  3. 方法三使用查表法优化,特别适合于多次调用的场景

n & (n-1) 的原理

n & (n-1) 操作可以消除 n 中最低位的 1。这是因为:

  • n-1 会将 n 中最低位的 1 变为 0,并将这个位之后的所有 0 变为 1
  • 将 n 与 n-1 做按位与操作,会保留除了最低位 1 及其之后的位之外的所有位,因此可以消除最低位的 1

例如:

  • n = 10110100 (180)
  • n-1 = 10110011 (179)
  • n & (n-1) = 10110000 (176)

可以看到,最低位的 1(第3位)被消除了。

常见错误

  1. 没有考虑到无符号整数和有符号整数的区别,导致右移操作结果错误
  2. 循环次数错误,没有正确处理32位整数
  3. 在方法二中,如果n为0时没有正确处理
  4. 在查表法中,没有正确分割32位整数

相关题目

  • 190. 颠倒二进制位
  • 231. 2的幂
  • 338. 比特位计数
http://www.cadmedia.cn/news/4400.html

相关文章:

  • 一站式营销型网站建设服务关键词排名点击工具
  • 建设网站怎么入账发布软文网站
  • 江苏网站开发电话百度网站排名规则
  • 公司网站建设申请单网站查询备案信息
  • 浙江省城乡住房建设网站百度客服电话
  • 长治网站建设招聘搜索网站排名
  • 真封神网站后台建设教程百度seo推广怎么收费
  • 萍乡公司做网站恶意点击软件
  • 汽车行业网站建设自己怎么建网站
  • 广州上市网站建设的公司百度信息流广告怎么收费
  • 网站建设商家公司推广普通话的手抄报
  • 秦皇岛信息网重庆百度seo排名
  • 网站宣传的作用百度推广投诉电话客服24小时
  • 商城网站建设的注意事项电商平台有哪些
  • 空间站 对接网站建设网络公司
  • 南岗哈尔滨网站建设网盘搜索
  • 响应式web合肥百度快照优化排名
  • 建网站自学外链价格
  • 哈尔滨网站营销推广天津百度关键词seo
  • 网站底部特效如何制作个人网站
  • 响应式网站建设特征网络销售的好处和意义
  • 沈阳建设网站关键词排名优化报价
  • 深圳坪山高铁站惠州seo网站推广
  • 专业制作各种证书西安网站seo
  • 深圳电子网站建设站长推广网
  • 网站建设资金方案今日国内新闻最新消息
  • 兰州网站建设托管ip域名查询网站入口
  • 网站制作 长沙新手做seo怎么做
  • 网站建设中党建站长工具seo综合查询分析
  • 成都锦江区网站建设公司昆明百度推广开户