【刷穿剑指】剑指 Offer II 002. 二进制加法

开坑 剑指 Offer 题目二刷,剑指的每一个题目都是非常经典且经常考察的题目,一共 119 道题目,针对不同的数据结构与算法,有许多难度不一的好题目。希望这次二刷能巩固第一次所学,并撰写自己的题解!大家和我一起加油吧!同时我会把力扣原题的链接附上。

整数篇 - 剑指 Offer II 002. 二进制加法

原题链接:剑指 Offer II 002. 二进制加法

【刷穿剑指】剑指 Offer II 002. 二进制加法_第1张图片

解析

先来看下 StringBuffer 和 StringBuilder 的区别。

StringBuffer StringBuilder
线程安全 非线程安全
同步 非同步
始于 Java 1.0 始于 Java 1.5

它们为字符串操作提供了 appendinsertdeletesubstring 方法。

因为题目没有告诉字符串长度,所以如果将字符串由二进制转为十进制整数可能会导致溢出。

是故,可以直接对字符串进行模拟,从末位开始。定义 StringBuilder 保存结果,最后将结果反转即可。

代码

class Solution {
    public String addBinary(String a, String b) {
        // String、StringBuffer、StringBuilder的区别
        // String 是 final 修饰的最终类,不可修改,多次使用加号连接字符串会导致过多对象废弃,垃圾多。StringBuffer 线程安全,以性能为代价,JDK1.0出现。StringBuilder 线程不安全,性能高,JDK1.5出现。。。
        StringBuilder res = new StringBuilder();
        int i = a.length() - 1;
        int j = b.length() - 1;
        int carry = 0; // 保存进位
        while (i >= 0 || j >= 0) {
            int digitA = i >= 0 ? a.charAt(i--) - '0' : 0;
            int digitB = j >= 0 ? b.charAt(j--) - '0' : 0;
            int sum = digitA + digitB + carry;
            carry = sum > 1 ? 1 : 0;
            sum = sum > 1 ? sum - 2 : sum;
            res.append(sum);
        }

        // 考虑最后一位是否存在进位
        if (carry >= 1) {
            res.append(1);
        }

        // 最后将 res 翻转,再 toString()
        return res.reverse().toString();
    }
}

写文不易,求个关注,没有关注,点赞也行!
【刷穿剑指】剑指 Offer II 002. 二进制加法_第2张图片

你可能感兴趣的:(刷题记录,java,leetcode,开发语言,面试)