LeetCode-二进制求和

题目

给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。

示例 1:

输入:a = "11", b = "1"
输出:"100"
示例 2:

输入:a = "1010", b = "1011"
输出:"10101"

我的解答

我想的很简单,从字符串的高位一直计算,专门用一个布尔值记录是否有进位,虽然代码行数多,但是计算结果是对的。

class Solution {
    public String addBinary(String a, String b) {
        int aLen = a.length();
		int bLen = b.length();
		int maxLen = Math.max(aLen, bLen);
		StringBuilder sb = new StringBuilder();
		boolean add = false;
		for (int i = 0; i < maxLen; i++) {
			if(aLen-1-i>=0&&bLen-1-i>=0){
				char aChar = a.charAt(aLen - 1 - i);
				char bChar = b.charAt(bLen - 1 - i);
				if (aChar == '1' && bChar == '1') {
					if (add) {
						sb.append("1");
					} else {
						sb.append("0");
					}
					add=true;
				}
				else if(aChar=='1'||bChar=='1'){
					if (add) {
						sb.append("0");
					} else {
						sb.append("1");
					}
				}
				else if(aChar=='0'&&bChar=='0'){
					if(add){
						sb.append("1");
					}
					else{
						sb.append("0");
					}
					add=false;
				}
			}
			else if(aLen-1-i>=0){
				char aChar = a.charAt(aLen - 1 - i);
				if(aChar=='1'){
					if(add){
						sb.append("0");
					}
					else{
						sb.append("1");
					}
				}
				else{
					if(add){
						sb.append("1");
						add=false;
					}
					else{
						sb.append("0");
					}
				}
			}
			else if(bLen-1-i>=0){
				char bChar = b.charAt(bLen - 1 - i);
				if(bChar=='1'){
					if(add){
						sb.append("0");
					}
					else{
						sb.append("1");
					}
				}
				else{
					if(add){
						sb.append("1");
						add=false;
					}
					else{
						sb.append("0");
					}
				}
			}
		}
		if(add){
			sb.append("1");
		}
		sb.reverse();
		return sb.toString();
    }
}

官方题解

class Solution {
    public String addBinary(String a, String b) {
        StringBuffer ans = new StringBuffer();

        int n = Math.max(a.length(), b.length()), carry = 0;
        for (int i = 0; i < n; ++i) {
            carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
            carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
            ans.append((char) (carry % 2 + '0'));
            carry /= 2;
        }

        if (carry > 0) {
            ans.append('1');
        }
        ans.reverse();

        return ans.toString();
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/add-binary/solutions/299667/er-jin-zhi-qiu-he-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思考

好消息是我和官方题解的思路是一样的,坏消息是我发现自己对二进制、ASCII码的机制一无所知,我的专业是读到狗肚子里去了么?!真是难堪,但生活还是得继续,所以记录以下经验:

  1. '0'的ASCII码值是48
  2. '0'+1的值是49
posted @ 2025-06-27 09:27  尼兰  阅读(8)  评论(0)    收藏  举报