天津 网站优化临沂网站建设有哪些
2026/1/21 5:03:37 网站建设 项目流程
天津 网站优化,临沂网站建设有哪些,有什么管理系统,wordpress精致主题在字符串题里#xff0c;Add Binary 是一个非常典型、同时又非常适合考察模拟 指针 进位处理的面试题。leetcode 很多同学第一次见到时#xff0c;直觉解法就是转成十进制相加再转回二进制#xff0c;但面试官往往希望你自己模拟二进制加法的全过程。 本文会从…在字符串题里Add Binary 是一个非常典型、同时又非常适合考察模拟 指针 进位处理的面试题。leetcode很多同学第一次见到时直觉解法就是转成十进制相加再转回二进制但面试官往往希望你自己模拟二进制加法的全过程。本文会从题目、自己的初始思路用栈出发一步步梳理出更接近标准面试写法的解法并顺便聊聊面试官可能会怎么追问你。egbert-yu-ting.github1题目与示例题目描述leetcode给定两个二进制字符串 a 和 b返回它们的和相加结果结果也用二进制字符串表示。示例intervue1示例 1输入a “11”, b “1”输出“100”示例 2输入a “1010”, b “1011”输出“10101”约束platformalgorithmsdatastructures.kingofinterviews11 a.length, b.length 10^4a 和 b 只包含 ‘0’ 和 ‘1’除了数字 0 本身字符串中不存在前导 0注意长度可以到 10^4这意味着不能转成普通整型相加否则存在溢出风险。algo1初始思路用栈模拟手算先看一个非常自然、也完全能通过的思路用栈来反转结果。思路步骤准备一个栈存放每一位相加后的结果。从低位到高位从字符串末尾往前取出当前位的 a 和 b如果已经越界就当作 0和当前的 carry 一起相加sum bitA bitB carry当前位结果是 sum % 2压栈更新进位 carry sum / 2。遍历结束后如果 carry 还为 1再额外压栈一个 1。不断弹栈把数字 0/1 转成字符 ‘0’/‘1’ 拼接成结果字符串。复杂度分析时间复杂度O(nm)其中 n 和 m 是两个字符串长度。algomap空间复杂度O(nm)栈中存下了所有位。algomap这个解法在面试中绝对是正确解不会被一票否决。真正的区别在于你能不能在面试官轻轻一提的情况下往更优、更简洁的写法走一步。面试官视角会追问什么你说完上面栈的思路后面试官很可能会顺着这几个方向提问1. “一定要用栈吗”这一问的核心是你是否意识到栈只是帮你反转顺序。你现在是「从低位往高位算」→ 结果低位先拿到 → 用栈反过来。但是反转有很多方式比如可以先把结果存在一个数组或字符串里最后整体反转可以使用 StringBuilder 前插insert(0, …)虽然有时效率稍差。这时如果你能自然说出其实栈不是必须的我也可以用双指针 StringBuilder然后最后反转的版本就会显得思路更加抽象、清晰。2. “空间还能再省一点吗”这里的考点是你能否把额外空间降到 O(1)不算返回结果本身。dev1遍历时只需要两个指针 i, j一个整型 carry一个用来构建最终结果的 StringBuilder 或字符串。不再需要栈这种额外的数据结构。3. “大输入会不会溢出”如果你一开始说的是 int(a, 2) int(b, 2) 这种写法面试官几乎一定会追问这个方法对 10^4 长度的二进制字符串安全吗如果语言是 Java、C用 int / long 会发生什么所以更稳妥的回答是题目长度上限很大不能依赖内置整数类型需要自己模拟按位加法。algo1更标准的写法双指针 进位 反转下面是把你栈思路小幅演化后在面试中非常常见、也更推荐的一版核心思想使用两个指针i a.length - 1 指向 a 的最低位j b.length - 1 指向 b 的最低位。初始化 carry 0。循环条件写成while (i 0 || j 0 || carry ! 0)每次循环sum carry如果 i 0sum a[i] - ‘0’然后 i–如果 j 0sum b[j] - ‘0’然后 j–当前位结果 sum % 2 加入结果字符串更新 carry sum / 2。最终把结果字符串整体 reverse 一下就是答案。dev1伪代码类 C / Java 风格function addBinary(a, b): i a.length - 1 j b.length - 1 carry 0 result 空字符串或 StringBuilder while i 0 or j 0 or carry ! 0: sum carry if i 0: sum (a[i] - 0) i - 1 if j 0: sum (b[j] - 0) j - 1 bit sum % 2 carry sum / 2 // 整除 // 因为是从低位往高位算可以先拼在尾部最后再反转 result.append(字符(bit 0)) // 现在 result 是反过来的需要整体反转 reverse(result) return result.toString()复杂度时间复杂度O(nm)只遍历一遍两个字符串。dev1空间复杂度额外空间 O(1)只使用常数个变量不计返回字符串。algomap1和用栈的版本对比两者在时间上是一样的区别在于空间更精简代码也更符合常见模板更像你已经刷过一圈题之后的写法。实战中容易踩的坑做这题时有几个细节很容易出错越界处理当 i 0 或 j 0 时应该把对应位当作 0而不是直接访问数组。循环条件写得不严谨如果写成 while (i 0 || j 0)最后 carry 可能还为 1但你已经退出循环了。最安全的是while (i 0 || j 0 || carry ! 0)字符与数字之间的转换获取当前位a[i] - ‘0’b[j] - ‘0’。拼回字符bit ‘0’。结果反转忘记从低位算到高位如果你是一直 append 到字符串尾部最后一定要 reverse 一次。总结从能做出来到写得漂亮从这道题可以看到一个常见的进阶路径第一步能想到用栈从低位到高位模拟说明对进位加法的本质已经理解到位第二步意识到栈只是为了反转可以被 StringBuilder reverse 等方式替代第三步自然写出双指针 carry 一次遍历的版本时间 O(n m)空间 O(1)并能清晰讲出边界和复杂度。如果你已经有了用栈的初始版本非常建议下一步自己手写一遍双指针版本重点训练while 条件越界时的处理字符与数字的转换。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询