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

翻转数位题目解释和代码

这段代码的功能是计算一个32位整数中,经过至多一次位翻转(0变1或1变0)后能得到的连续1的最大长度。例如,输入1775(二进制11011101111),翻转中间的0后变为11011111111,连续1的最大长度为8。

核心思路

代码通过维护两个变量curinsert来跟踪当前连续1的长度和包含一次翻转的最长长度:

  1. cur:记录当前连续1的长度(遇到0时重置为0)。
  2. insert:记录包含一次翻转的连续1的最大长度。每次遇到0时,insert更新为cur + 1(即把当前0翻转后的长度)。
  3. 遍历每一位:检查每一位是0还是1,并更新curinsert的值,最终取最大值res

代码逐行解释

int reverseBits(int num) {int res = 0;    // 最终结果:连续1的最大长度int cur = 0;    // 当前连续1的长度int insert = 0; // 包含一次翻转的连续1的长度for (int i = 0; i < 32; ++i)  // 遍历32位整数的每一位{if (num & (1 << i))  // 如果当前位是1{cur++;       // 连续1的长度加1insert++;    // 包含翻转的长度也加1}else  // 如果当前位是0{insert = cur + 1;  // 翻转当前0,长度为前面连续1的长度+1cur = 0;           // 重置当前连续1的长度为0}res = max(res, insert);  // 更新最大长度}return res;
}

关键逻辑分析

  1. 遇到1时
    • curinsert都加1,表示连续1的长度增加。
  2. 遇到0时
    • insert更新为cur + 1,即假设翻转当前0后的总长度。
    • cur重置为0,因为当前连续1的序列被打断。
  3. 为什么有效?
    • 每次遇到0时,insert记录了“上一段连续1 + 当前翻转的0”的长度。
    • 如果后续还有连续1,insert会继续累加,相当于“上一段连续1 + 翻转的0 + 新的连续1”。

示例验证

输入num = 1775(二进制11011101111):

位: 1 1 0 1 1 1 0 1 1 1 1 0 ...(其余为0)
i   0 1 2 3 4 5 6 7 8 9 10 11...
cur 1 2 0 1 2 3 0 1 2 3 4 0...
ins 1 2 3 1 2 3 4 1 2 3 4 5...
res 1 2 3 3 3 3 4 4 4 4 4 5...最终res = 8(翻转第6位后的连续长度)

总结

这段代码巧妙地利用一次遍历,通过维护两个变量curinsert,在线性时间内计算出翻转至多一位后的最长连续1的长度。其核心思想是动态更新包含一次翻转的最大长度,确保正确性的同时保持高效性。

相关文章:

  • Pandas:数据处理与分析
  • 金融学知识笔记
  • 学习适应对智能软件对对象的属性进行表征、计算的影响
  • 深入了解 ArkTS:HarmonyOS 开发的关键语言与应用实践
  • 什么是向量数据库?向量数据库和关系数据库有什么区别?
  • DAMA语境关系图汇总及考前须知
  • Java【网络原理】(5)深入浅出HTTPS:状态码与SSL/TLS加密全解析
  • AI安全之对抗样本攻击---FGSM实战脚本解析
  • 线性表-顺序表(Sequential List)
  • SpringMVC-执行流程
  • QB/T 1649-2024 聚苯乙烯泡沫塑料包装材料检测
  • C++(4):const关键字
  • 关于甲骨文(oracle cloud)丢失MFA的解决方案
  • Java 24新特性深度解析:从优化技巧到高手进阶指南
  • 【STM32 学习笔记】I2C通信协议
  • 健康养生:开启活力生活的密码
  • 养生:开启健康生活的密钥
  • 优选算法——队列+BFS
  • 动态规划之二维费用的背包问题解析
  • 数据结构·ST表
  • 拿出压箱底作品,北京交响乐团让上海观众享受音乐盛宴
  • 股价两天涨超30%,中航成飞:不存在应披露而未披露的重大事项
  • 首届上海老年学习课程展将在今年10月举办
  • 罗氏制药全新生物制药生产基地投资项目在沪启动:预计投资20.4亿元,2031年投产
  • 昆廷·斯金纳:作为“独立自主”的自由
  • 两国战机均未侵入对方领空,巴方公布对印回击细节