Leetcode - 二进制求和 E[67]

news/2024/7/8 11:44:05

题目描述

给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。

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

提示:
     每个字符串仅由字符 '0' 或 '1' 组成。
     1 <= a.length, b.length <= 10^4
     字符串如果不是 "0" ,就都不含前导零。

 方式一:

        1. 将传来的 a, b 两个字符串转换成为字符数组

        2. 选取较长的字符串存储和 -[ 只进行对于位上的相加操作,并不处理进位 ]

        3. 进行变化(字符串是二进制数)-[ 处理进位 ]

        4. 判断首部情况

有些不好意思,代码太长了,不够简洁。

代码

            char[] char_a = a.toCharArray();
            char[] char_b = b.toCharArray();
            int len1 = a.length();
            int len2 = b.length();
            int flag = 0;
            boolean preAdd = false;
            if (len1 >= len2) {
                flag = 1;
                for (int i = 0; i < len2; i++) {
                    if (char_b[len2 - 1 - i] == '0') {
                        continue;
                    }
                    if (char_a[len1 - 1 - i] == '1') {
                        char_a[len1 - 1 - i] = '2';
                        if(len1 - 1 - i == 0){
                            preAdd = true;
                        }
                        continue;
                    }
                    char_a[len1 - 1 - i] = '1';
                }
            } else {
                for (int i = 0; i < len1; i++) {
                    if (char_a[len1 - 1 - i] == '0') {
                        continue;
                    }
                    if (char_b[len2 - 1 - i] == '1') {
                        char_b[len2 - 1 - i] = '2';
                        if(len2 - 1 - i == 0){
                            preAdd = true;
                        }
                        continue;
                    }
                    char_b[len2 - 1 - i] = '1';
                }
            }
            char[] find = flag == 1 ? char_a : char_b;
            for (int i = find.length - 1; i >= 0; i--) {
                if (find[i] == '2' || find[i] == '3') {
                    if(i == 0){
                        preAdd = true;
                    }
                    find[i] = find[i] == '2' ? '0' : '1';
                    if (i > 0) {
                        switch (find[i - 1]) {
                            case '0':
                                find[i - 1] = '1';
                                break;
                            case '1':
                                find[i - 1] = '2';
                                break;
                            case '2':
                                find[i - 1] = '3';
                                break;
                        }
                    }
                }
            }
            StringBuilder builder = new StringBuilder();
            if (preAdd) {
                builder.append('1');
            }
            for (char c : find) {
                builder.append(c);
            }
            return builder.toString();

 执行结果

 

 方式二

        建立一个StringBulider 类型的对象来存储 二进制相加的和,一个 int 类的变量来判断进位情况,两个字符串的长度不一定相等,但字符串的尾部位数相同,所以我们从尾部开始进行处理。

处理方法:将字符串对应位置上的字符转换成为整型,然后根据整型的大小来进行 ans 数据的添加和 add 变量的修改。

Ps: 注意 字符串长度不一;add变量在循环结束可能等于 1,会产生进位。

代码

            /* 存储二进制和 */
            StringBuilder ans = new StringBuilder();
            /* 处理进位情况 */
            int add = 0;
            for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
                int sum = add;
                /* 获取a,b字符串相对应位数上和[转换成int 类型数据] */
                sum += i >= 0 ? a.charAt(i) - '0' : 0;
                sum += j >= 0 ? b.charAt(j) - '0' : 0;
                /* 添加数据 */
                ans.append(sum % 2);
                /* 修改进位 */
                add = sum / 2;
            }
            /* 判断是否有进位 */
            ans.append(add == 1 ? add : "");
            /* 在计算的时候从最后一位开始, 所以将StringBulider进行反转然后转换成为字符串返回 */
            return ans.reverse().toString();

执行结果

 

 


http://www.niftyadmin.cn/n/4557800.html

相关文章

抽象类的继承

接口中有定义的方法 具体方法功能代码可以不写&#xff09;如果是继承接口 也要把方法名照写上 即使不知道具体干某些事情 具体干某些事情 就必须对抽象类中的每个方法都进行实现(换种说法就是具体化 abstract class cWeapon{ int damage; abstract int setDamage(); abstract …

Leetcode - 无重复字符的最长字串 M[3]

问题描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 示例 2:输入: s "bbbbb"输出: 1解释: 因为无…

asp.netmvc 三层搭建一个完整的项目

接下来用 asp.net mvc 三层搭建一个完整的项目&#xff1a; 架构图: 使用的数据库: 一张公司的员工信息表&#xff0c;测试数据 解决方案项目设计&#xff1a; 1.新建一个空白解决方案名称为Company 2.在该解决方案下,新建解决方案文件夹(UI,BLL,DAL,Model) 当然还可以加上comm…

eclipse 编的java程序运行后显示问号

在Resource中把编码改成GBK或者是GB2312 ||| 改为GB2312 或者 GBK 就不会了 选中properties属性 你右键单击该类 在右边选择GBk 答案补充 直接输入GBK就行了 答案补充 选择下面的others ||| 在我这里都没错啊 然后找到resource 选择Properties 然后找到你的文件点击右键 在reso…

Leetcode - 杨辉三角II E[119]

问题描述 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1:输入: rowIndex 3输出: [1,3,3,1] 示例 2:输入: rowIndex 0输出: [1] 示例 3:输入: rowIndex 1输出: [1,1] 提…

JAVA的 计机二级 那个网站有<南开一百题>买

cid2F35BFABE23E23FFCF1629CD90A9223FB4FAD7DC&t2&fmt- 答案补充 淘宝上多的是 cid8FF7C259950B06053CC5E9A71270E178E387F7AB&t13&fmt-下种子 答案补充 java :http://119.147.41.16/down 迅雷http://119.147.41.16/down

BZOJ 4395: [Usaco2015 dec]Switching on the Lights

4395: [Usaco2015 dec]Switching on the Lights Description Farmer John has recently built an enormous barn consisting of an NNNN grid of rooms (2≤N≤100), numbered from (1,1)up to (N,N). Being somewhat afraid of the dark, Bessie the cow wants to turn on the…

Leetcode - 买卖股票的最佳时机 E[121]

问题描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最…