LeetCode-二进制求和

<?xml version="1.0" encoding="utf-8"?> LeetCode-二进制求和

LeetCode-二进制求和

1 Easy-二进制求和

1.1 题目描述

给定两个二进制字符串,返回他们的和(用二进制表示)。

输入为非空字符串且只包含数字 1 和 0。

1.2 示例 1:

输入: a = "11", b = "1"

输出: "100"

1.3 示例 2:

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

输出: "10101"

2 自己的解答

2.1 思路

  1. 使用a和b中较长者作为循环终止条件,遍历a和b字符串.逆序遍历,比较符合普通人理解的二进制求和方法.
  2. 定义一个变量up,表示是否有进位,'1'为有进位,'0'为没有进位.
  3. 将a和b当前位置的字符加上进位符up,再减去两个'0'字符,即得到当前位的和c.
    • 如果当前位的和c大于'2',说明有进位,将up更新为'1'.并将c减去'2'之后插入到StringBuilder变量的首端.
    • 如果当前位置的和c小于'2',说明没有进位,将up更新为'0',并将c插入到StringBuilder变量的首端.
  4. 当a和b其中一方已经遍历完后,未遍历完的一方放入StringBuilder变量的首端,同时要判断是否由进位.
  5. 在循环结束之后,如果进位符没有被恢复为'0',说明最后有进位,需要在StringBuilder变量首端插入'1'.

2.2 反思

  1. 思路是正确的,但是实现起来太过复杂.
  2. 以后遇到此种情况可以转换思路,如果操作String不方便,可以将String变为int,来计算二进制的和.
    • 例如:用int变量sum记录a和b对应位置字符的和,然后sum%2就是当前位置字符的int形式,并将其添加到StringBuilder中.是否有进位可以通过sum/2判断,并可以将carry作为下一次sum的初始值.

2.3 代码

2.3.1 自己的代码
package algorithm.easy;

public class AddBinary {
    public static String solution(String a, String b) {
        StringBuilder sb = new StringBuilder();
        int alen = a.length();
        int blen = b.length();
        int N = alen > blen ? alen : blen;
        char up = '0';
        char c = ' ';
        for (int i = 1; i <= N; i++) {
            int ai = a.length() - i;
            int bi = b.length() - i;
            if (ai < 0) {
                // b比a长
                // 有上一位的进位
                if (up == '1') {
                    c = (char) (b.charAt(bi) + up - '0');
                    if (c < '2') {
                        sb.insert(0, c);
                        // 恢复上一位进位
                        if (up != '0') {
                            up = '0';
                        }
                    } else {
                        if (up != '1') {
                            // 有进位
                            up = '1';
                        }
                        sb.insert(0, '0');
                    }
                    continue;
                } else {
                    // 没进位,直接把剩余的字符串插入即可
                    sb.insert(0, b.substring(0, bi + 1));
                    break;
                }
            }
            if (bi < 0) {
                // a比b长
                // 有上一位的进位
                if (up == '1') {
                    c = (char) (a.charAt(ai) + up - '0');
                    if (c < '2') {
                        sb.insert(0, c);
                        // 恢复上一位进位
                        if (up != '0') {
                            up = '0';
                        }
                    } else {
                        if (up != '1') {
                            // 有进位
                            up = '1';
                        }
                        sb.insert(0, '0');
                    }
                    continue;
                } else {
                    // 没进位,直接把剩余的字符串插入即可
                    sb.insert(0, a.substring(0, ai + 1));
                    break;
                }
            }
            c = (char) (a.charAt(ai) + b.charAt(bi) + up - '0' - '0');
            if (c < '2') {
                // 插入到sb中
                sb.insert(0, c);
                // 恢复上一位进位
                if (up != '0') {
                    up = '0';
                }
            } else {
                if (up != '1') {
                    // 有进位
                    up = '1';
                }
                c = (char) (c - '2' + '0');
                // 插入到sb中
                sb.insert(0, c);
            }
        }
        // 到最后还有进位,则插入1一个1,否则不插入
        if (up == '1') {
            sb.insert(0, '1');
        }

        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(solution("1010","1011"));
        System.out.println(solution("11","1"));
        System.out.println(solution("110","110010"));
        System.out.println(solution("101111","10"));
        System.out.println(solution("0", "0"));
        System.out.println(solution("100", "110010"));
    }
}
2.3.2 别人的代码
class Solution {
    public String addBinary(String a, String b) {
        StringBuilder sb = new StringBuilder();
        int i = a.length() - 1;
        int j = b.length() - 1;
        int carry = 0;
        while (i >= 0 || j >= 0) {
            int sum = carry;
            if (i >= 0) {
                sum += (a.charAt(i) - '0');
                i--;
            }
            if (j >= 0) {
                sum += (b.charAt(j) - '0');
                j--;
            }
            sb.append(sum % 2);
            carry = sum / 2;
        }
        if (carry != 0){
            sb.append(1);
        }
        return sb.reverse().toString();
    }
}

Date: 2018-11-06 21:00

Author: devinkin

Created: 2018-11-06 二 21:00

Validate

转载于:https://www.cnblogs.com/devinkin/p/9918026.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值