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

【每日一题】LeetCode 1404. 将二进制表示减到 1 的步骤数

Link

给你一个以二进制形式表示的数字 \(s\)。请你返回按下述规则将其减少到 \(1\) 所需要的步骤数:

如果当前数字为偶数,则将其除以 \(2\)

如果当前数字为奇数,则将其加上 \(1\)

题目保证你总是可以按上述规则将测试用例变为 \(1\)


思考操作对每位数字带来了什么影响。

假设我们有一个一般的 \(s\),假定 \(s = 11001100\)

  • 除以 \(2\)\(11001100 \to 1100110\)
  • 除以 \(2\)\(1100110 \to 110011\)
  • 加上 \(1\)\(110011 \to 110100\)
  • 除以 \(2\)\(110100 \to 11010\)
  • 除以 \(2\)\(11010 \to 1101\)
  • 加上 \(1\)\(1101 \to 1110\)
  • 除以 \(2\)\(1110 \to 111\)
  • 加上 \(1\)\(111 \to 1000\)
  • 除以 \(2\)\(1000 \to 100\)
  • 除以 \(2\)\(100 \to 10\)
  • 除以 \(2\)\(10 \to 1\)
  • 结束

一个很重要的发现是:要删掉一个末尾的 \(1\),需要先加上 \(1\) 把它变成 \(0\),再除以 \(2\)。这样需要两次操作。

由于进位,加上的这个 \(1\) 可以看成是加给了 \(s\) 的最后一个 \(0\)。整个串的末尾从 \(\cdots 011\cdots11\) 变成了 \(\cdots 100 \cdots 00\)。之后,原先是 \(1\) 的位置只需要一直除以 \(2\) 就能够删干净。

现在看看删掉 \(1\) 之后极长的一段 \(0\) 发生的变化。原本是 \(00\cdots0011\cdots11\) 的串,由于末尾 \(1\) 的存在,先加 \(1\) 变为 \(00\cdots0100\cdots00\),忽略原先是 \(1\) 的位置,变成 \(00\cdots01\)。这时要加 \(1\) 再除以 \(2\),消掉一个字符,又回到 \(00\cdots01\) 的形式。

我们以加上 \(1\) 除以 \(2\) 为一个循环,可以认为每个 \(0\) 都需要两次操作。最后一个 \(0\) 在先前的操作中会先一步变为 \(1\),和若干 \(1\) 子串(如果存在)结合,实际上又回到了前述情形。注意一开始我们就加了一次 \(1\),实际上循环是形如加-加-除-加-除的,要多加一次。

现在我们得出结论:所有的 \(1\) 都需要 \(1\) 次操作,所有的 \(0\) 都需要 \(2\) 次操作(除非其处于最后一个 \(1\) 的后面,此时只需要 \(1\) 次操作),加上 \(1\) 次额外的操作即为答案。

边界条件是 \(100\cdots00\),这时这个 \(1\) 不需要 \(1\) 次操作,并且这个额外的操作也不存在,因为一直除以 \(2\) 就能够抹去,剩下 \(1\)

时间复杂度和空间复杂度均为 \(O(n)\)

class Solution {
public:int numSteps(string s) {return std::count(s.begin(), s.end(), '0') + s.find_last_of('1') + 2 * (std::count(s.begin(), s.end(), '1') != 1);}
};
http://www.jsqmd.com/news/415523/

相关文章:

  • 【村儿网通】把 Scaled Dot-Product Attention 展开写一遍
  • Andrew Stankevich Contest 44 (ASC 44) 总结
  • nohup ./webserver
  • 基于Lyapunov的控制器设计用于自主水下车辆(AUV)的轨迹跟踪,对于欠驱动的自主水下车辆(AUV)进行二维轨迹跟踪的仿真Lyapunov控制器设计附Simulink仿真、Matlab代码
  • 基于LSTM和SVM的设备故障诊断附Matlab代码
  • C++中的友元 之七
  • CT断层成像系列10——三维锥束FDK重建算法(附Matlab代码)
  • 东方博宜OJ 1108:正整数N转换成一个二进制数 ← 字符串 / 栈
  • 渗透测试零基础入门!从环境搭建到实战靶场通关,一篇吃透
  • 【渗透测试】一文吃透SQL注入漏洞!原理+分类+实战利用+防御方案
  • 260204
  • 【Playwright 】端到端自动化的开源框架
  • 【matlab】GUI句柄
  • 专业的文件上传漏洞检测工具,支持263+绕过技术、代理抓包、动态扫描
  • C++中的友元 之六
  • 五款免费AI视频生成神器,效果炸裂!
  • STM32F103C8T6 驱动 180° 舵机(SG90)超详细教程
  • 【开题答辩全过程】以 共享单车使用情况预测模型的设计与实现为例,包含答辩的问题和答案
  • C++中的友元 之五
  • 互斥锁
  • 数据库的应用-第一天
  • P3035 [USACO11DEC] Umbrellas for Cows S 题解
  • AI Compose Commit:用 AI 智能重构 Git 提交工作流
  • 题解:P11567 建造军营 II
  • C++中的友元 之四
  • 哈萨克斯坦旅游出行笔记
  • 2026年广州名士表手表维修推荐榜单评测:非官方维修网点服务与售后中心选择指南 - 十大品牌推荐
  • Gin 框架中的规范响应格式设计与实现
  • Computer Vision (Prof. Andreas Geiger, University of Tbingen)
  • QOJ #7324. Eulerian Orientation 题解