LeetCode刷题之旅(简单-16): 二进制求和

力扣基础速攻题单(排位刷分适用) Leetcode速攻题单 一部分:1.算法入门100讲系列 算法零基础100讲 1.2的幂 2.3的幂 3.4的幂 4.斐波那契数 5.第N个泰波那契数 6.剑指offer.求1+2+…+n 7.单调数列 8.最富有客户的资产总量 9.二进制矩阵中的特殊位置 10.翻转图像 11.旋转图像 12.转置矩阵 13.将一维数组转变为二维数组 14.判断矩阵经轮转后是否一致 15.二维网络迁移 16.杨辉三角 17.杨辉三角II 18.唯一元素的和 19.字符串中第一个唯一字符 20.检查是否所有字符出现次数相同 阅读详情

2019年6月15日

目录

题目:

解决方法1:暴力解释字符串运算

思路:

性能结果:

 

解决方法2:网友解法:判断每位字符是否一样

思路:

性能结果:

解决方法3:使用ASCII编码值运算,除以/整除2,获取当前位值/进位

思路:

性能结果:

小结:


 

题目:

 

解决方法1:暴力解释字符串运算


public class AddBinary {
    public static void main(String[] args){
        String a =  "100";
        String b = "110010";
        String result = addBinary(a, b);
        System.out.println("result="+result);
    }

    public static String addBinary(String a, String b) {

        if (a.equals("0") && b.equals("0")){
            return "0";
        }else if (a.equals("0")){
            return b;
        }else if (b.equals("0")){
            return a;
        }

        // 1.转为字符数组
        char[] charsA = a.toCharArray();
        char[] charsB = b.toCharArray();
        int maxLength = (charsA.length > charsB.length)?(charsA.length):(charsB.length) +1;

        // 2.递归解决
        String carryBit = "";
        char[] result = new char[maxLength +1]; //预留一个元素空间
        for (int i = 0;i < maxLength;i++){
            String charA = "0";
            String charB = "0";

            // 3.逐个比较。数组未越界则赋值
            if (charsA.length > i){
                charA = String.valueOf(charsA[charsA.length-1 -i]);
            }
            if (charsB.length > i){
                charB = String.valueOf(charsB[charsB.length-1 -i]);
            }

            // 4.递归解决
            String sum = countAB(charA, charB,carryBit);
            if (sum != null){
                switch (sum){
                    case "0": carryBit = "0";result[maxLength-i] = Character.valueOf('0'); break;
                    case "1": carryBit = "0";result[maxLength-i] = Character.valueOf('1'); break;
                    case "10":carryBit = "1";result[maxLength-i] = Character.valueOf('0'); break;
                    case "11":carryBit = "1";result[maxLength-i] = Character.valueOf('1'); break;
                    default:
                }
            }
        }

        // 5.比较最高位是否有进位
        if (carryBit.equals("1")){
            result[0] = '1';
        }
        String string = new String(result);
        StringBuilder stringBuilder = new StringBuilder();
        boolean flag = false;
        for (int i=0;i<string.length();i++){
            if (result[i] > Character.valueOf('0')){
                flag = true;
            }
            if (flag){
                stringBuilder.append(result[i]);
            }
        }

        return stringBuilder.toString();
    }

    // 位运算
    public static String countAB(String a, String b, String carryBit) {
        String result = "0";

        // 1.字符串余位判断(当有一个序列遍历结束)
        if (StringUtils.isEmpty(a)){
            result = b;
        }
        if (StringUtils.isEmpty(b)){
            result = a;
        }

        // 2.运算位判断
        if ("1".equals(a) && "1".equals(b)){
            result = "10";
        }
        if ("0".equals(a)){
            result = b;
        }
        if ("0".equals(b)){
            result = a;
        }

        // 3.进位判断
        if ("1".equals(carryBit)){
            switch (result){
                case "0": result = "1";break;
                case "1": result = "10";break;
                case "10": result = "11";break;
                default:
            }
        }

        return result;
    }
}

思路:

  • 一时半会没有想到更好的解决方法,于是按照对二进制运算的理解,前后提交了3次,最后才通过;自己也觉得解法不够好;
  • 算法解释:二进制运算简单,0,1,最多四种情况,对于进位,无非是多了一个判断而已;

性能结果:

 

解决方法2:网友解法:判断每位字符是否一样

class Solution {
	public String addBinary(String a, String b) {
		if (a.length() < b.length()) {
			String tmp = a;
			a = b;
			b = tmp;
		}
		char[] charsA = a.toCharArray();
		int aLength = charsA.length - 1;
		int bLength = b.length() - 1;
		char carry = '0';
		while (aLength >= 0) {
			char charsB = '0';
			if (bLength >= 0) {
				charsB = b.charAt(bLength);
			}
			if (charsA[aLength] == charsB) {
				charsA[aLength] = carry;
				if (charsB != '0') {
					carry = '1';
				}else {
					carry = '0';
				}
			}else {
				if (carry == '0') {
					charsA[aLength] = '1';
				}else {
					charsA[aLength] = '0';
					carry = '1';
				}
			}
			bLength --;
			aLength --;
		}
		return carry == '0'? String.valueOf(charsA):"1"+ String.valueOf(charsA);
	}
}

思路:

  • 不考虑二进制转十进制进行加法再转换回二进制的方法,这种方法有可能会出现溢出。

    先找出最长字符串,指定长的为 a,短的为 b。
    将 a 转为字符数组,并以此进行加法,用 carry 记录进位。
    遍历字符数组,进行加法运算。
    注意 1:b 比 a 短,所以会先到达 0 坐标点,此时 b 跟 a 加的字符应当为 '0'
    注意 2:如果 a 到达0坐标仍有进位,此时要把1加到第一位。

     

性能结果:

 

解决方法3:使用ASCII编码值运算,除以/整除2,获取当前位值/进位

public class BinaryAdd {

    public static void main(String [] args){
        String a="101";
        String b="100";
        String result = binaryAdd(a, b);
        System.out.println("result"+result);
    }

    public static String binaryAdd(String a,String b){
        int carry = 0;
        int i = a.length() -1;
        int j = b.length() -1;

        StringBuilder sb = new StringBuilder();
        while (i >= 0 || j >= 0){
            int sum = carry;

            if (i>=0){
                sum += a.charAt(i--) - '0';
            }

            if (j>=0){
                sum += b.charAt(j--) - '0';
            }

            sb.append(sum%2);
            carry = sum/2;
        }
        if (carry > 0){
            sb.append(carry);
        }
        return sb.reverse().toString();
    }
}

思路:

  •  将字符串的运算转为数字运算,非常巧妙啊!(整除解决当前位、除法解决进位)

性能结果:

小结:

差异化思维:这是解题的小秘诀,就是判断两个字符是否一致,一致情况下,如果任意为1或0,都将推出是否需要进位了;(差异化思维)

一般写代码惊艳比较欠缺时,会以我这种菜鸟的顺序思维去解决问题,这样往往会费力很多;

关于深度可分离卷积 关于深度学习中的深度可分离卷积 阅读详情

相关推荐

用Arduino和8个舵机,从零搭建一台能走路的并联腿机器狗(附完整代码与3D模型)

本文详细介绍了如何用Arduino和8个舵机从零搭建一台能走路的并联腿机器狗,包括硬件准备、结构组装、电路系统搭建、运动算法实现和Arduino编程。通过完整的代码与3D模型,帮助创客深入理解机器人运动原理,实现稳健行走的8自由度机器狗。

weixin_30482383的博客 702

16进制转换为8进制

问题描述   给定n个十六进制正整数,输出它们对应的八进制数。输入格式   输入的第一行为一个正整数n (1&lt;=n&lt;=10)。   接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式   输出n行,每行为输入对应的八进制正整数。   【注意】   输入的十六进制数不会有前导0,比如012A。   输出的八...

星 2530

数字电路复位信号设计(异步复位、同步释放)笔记详解

复位信号设计(异步复位、同步释放)笔记详解 1 时序设计 1.1 复位信号设计(异步复位、同步释放) 1.1.0 复位恢复时间和清除时间 首先解释一下恢复时间(recovery time)和清除时间(removal time):(以复位信号低电平有效为例) 复位恢复时间(recovery time):撤销复位时,复位信号无效到时钟有效沿来临之间需要维持的最小的时间,类似于同步时钟的建立时间setup time; 复位清除时间(removal time):复位时,在时钟有效沿来临之后复位信号还需要保持复位

weixin_42294124的博客 1万+

你有多久没有坚持过一件事情了?如果没有就来刷一轮力扣LeetCode

选择一样你想做的事情,坚持21天。如果没有想好,那就先来刷一轮力扣吧!~

车手只需要车和手,压力来自轮胎 1360

西电微原课设——矩阵式键盘数字密码锁设计

内容要求:根据设定好的密码,采用4x4矩阵键盘实现密码的输入功能。当密码输入正确之后,锁就打开(绿灯亮),10秒之后,锁自动关闭(红灯亮);如果连续输入三次密码不正确,就锁定按键5秒钟,同时发出报警(黄灯闪),5秒后,解除按键锁定,恢复密码输入。...

Polaris的博客 1万+

基于继电器与三极管的自动水泵控制器DIY:从电路原理到PCB制作实战

继电器作为一种利用电磁原理实现电路通断控制的电气开关,其核心价值在于通过小电流信号控制大电流负载,实现强弱电之间的安全隔离。在自动化控制领域,继电器常与三极管等半导体器件配合,构成驱动电路,将微弱的传感器信号放大,从而可靠地控制电机、水泵等执行机构。这种组合技术广泛应用于工业控制、智能家居及各类电子DIY项目中,例如实现水箱水位的自动检测与控制。本文将以一个典型的自动水泵控制器项目为例,深入剖析如何利用继电器与三极管搭建水位检测与驱动电路,并详细讲解从电路设计、PCB自制(热转印法)到系统调试的完整工程实践

weixin_31774841的博客 347

LeetCode刷题汇总

剑指offer 剑指 Offer 03 数组中重复的数字 剑指 Offer 04 二维数组中的查找 剑指 Offer 05 替换空格 剑指 Offer 06 从尾到头打印链表 剑指 Offer 07 重建二叉树 剑指 Offer 09 用两个栈实现队列 剑指 Offer 10- I 斐波那契数列 剑指 Offer 10- II 青蛙跳台阶问题 剑指 Offer 11 旋转数组的最小数字 剑指 Offer 12 矩阵中的路径 剑指 Offer 13 机器人的运动范围 剑指 Offer 14- I 剪绳子 剑指

weixin_44171872的博客 2万+

告别OLE!Delphi操作Excel的3种轻量级方案横向评测(FlexCel/XLSReadWriteII/LibXL)

本文深入评测了Delphi操作Excel的三种轻量级方案:FlexCel、XLSReadWriteII和LibXL。通过技术架构、API设计、性能测试和实战案例的全面对比,帮助开发者选择最适合的工具,提升Excel文件处理效率,告别传统OLE方案的依赖和性能问题。

onion的博客 929

力扣(LeetCode)刷题,简单题(第16期)

力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。

不脱发的程序猿 3229

LeRobot 入门教程(十一)π0(Pi0)π0.5(Pi0.5)训练、推理、部署

本文介绍了Physical Intelligence公司开发的π₀和π₀.₅系列通用机器人控制视觉-语言-动作模型。π₀作为首款基础模型,融合流匹配、跨实体训练等技术,支持50Hz高频控制。π₀.₅是其升级版,通过异构数据协同训练解决开放世界泛化问题,在Libero基准测试中表现优异。文章详细说明了两个模型的安装要求、使用方法、训练策略及关键参数配置,包括混合精度训练、梯度检查点等优化技术,为机器人在多样化场景中的语义理解和动作控制提供了完整解决方案。

2506_90492529的博客 5038

【LDPC-7】LLR量化位宽对LDPC译码性能的影响分析——以最小和译码算法为例进行matlab仿真

最小和译码算法的步骤如下:最后译码结果如果满足或者完成所有迭代次数,则译码算法停止迭代,否则继续进行译码迭代操作。

FPGA/MATLAB学习教程/源码/项目合作开发 1471

坚持刷力扣题第二周!!!

前言 接着上一篇文章,我已经坚持刷了八天的题和更新了八天的博客,八天一共刷了25题,有难有易,坚持一周对我来说已经是很大的一个进步了,但是这个活动昨天才开始哦!第一届LeetCode刷题打卡赢现金活动,其他小伙伴快来和我们一起卷起来吧!!!! 肝就完事,不说了我要上号了!! 2021-10-16 题目· 1.链表相交 题解 1.链表相交 这个链表相交其实就是相交的地方是相同的地址,所以我们可以遍历,然后在判定两个链表是否相等。 如果两个链表长度相等的话,就直接可以..

小宝的博客 1162

Dify与第三方平台(飞书、微信、钉钉)LangBot机器人对接实战

调用链路:飞书用户发消息 → 飞书开放平台事件回调 → LangBot 服务 → Dify 应用接口 → Dify 知识库 + 大模型生成答案 → 原路返回飞书聊天框Dify:承载知识库、提示词配置、大模型调用能力;LangBot:多 IM 渠道适配器,统一对接各大 IM 开放平台与 Dify API;飞书开放平台:提供机器人消息收发、事件推送能力。LangBot 作为中间转发服务,一端对接 Dify 应用 API,一端对接飞书开放平台机器人接口;

悦分享 269

LeetCode16—— 二进制求和

LeetCode16—— 二进制求和 学习目标: 题目内容: 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-binary python实现: 方法一:先求出二进制对应的十进制,求和以后返回二进制 class Solution(object): def addBinary(self, a, b): """ :type a: str :type b: str :rty

a_1234567890_的博客 227

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java算法 leetcode简单刷题记录10

庆祝一下:大概花费了9天,我把所有leetcode Java 的简单题都刷完了,接下来开始冲刺中等和复杂;PriorityQueue每次弹出队列里剩下的值中的最大值,最小值;特殊字符,直接split会不起作用,需要用 \+"."等。判断闰月即可:整除4不被100整除,或者整除400。

qq_40985985的博客 1321

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LeetCode刷题笔记 [67] 二进制求和 *未解决

/* * @lc app=leetcode.cn id=67 lang=c * * [67] 二进制求和 * * https://leetcode-cn.com/problems/add-binary/description/ * * algorithms * Easy (45.62%) * Total Accepted: 16K * Total Submissions:...

AaronDew的博客 292

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LeetCode 67二进制求和&68文本左右对齐&69x的平方根

文本左右对齐 描述 给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。 你应该使用“贪心算法”来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ’ ’ 填充,使得每行恰好有 maxWidth 个字符。 要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。 文本的最后一行应为左对齐,且单词之间不插入额外的空格。 说明: 单词是指由非空格字符组成的字

bigsai 4124

【力扣LeetCode】 67二进制求和

本文针对力扣第67题「二进制求和」,提出了一种基于​​高精度计算​​的清晰解法。该方法先将两个输入字符串​​逆序存储​​并​​统一长度​​至最高位,随后模拟竖式加法按位运算并处理二进制进位。最终,将结果数组逆序输出并转换为字符串。本文提供了详细的C++实现代码,重点讲解了​​逆序处理以对齐低位​​和​​进位控制​​等关键技巧,为处理二进制字符串加法提供了可靠方案

仟墨(郑龙浩)的博客 266

二进制刷题总结

3月8日:打卡的题目:2980(比较简单)、1318(思路牛)、2419(比较简单)、2871(思路牛)、2401(思路牛)3月9日:打卡的题目:2680最大或值(做了半天,第一种思路勉强,第二种没看懂)、3133真牛啊真牛啊太强了,思路和代码都牛3.11日:打卡的题目:342(4的幂)、191(位1的个数)、2595(奇偶位数)、2657(找两个数组的前缀公共数组)二进制数中1的个数x & 1例如当 x = 3 时,x 的二进制表示为 11,x & 1 的值为 1;

2301_79918816的博客 424

【力扣】难度【简单】67. 二进制求和

标题:67. 二进制求和 难度:简单 描述: 给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且只包含数字 1 和 0。 示例 1: 输入: a = “11”, b = “1” 输出: “100” 示例 2: 输入: a = “1010”, b = “1011” 输出: “10101” 提示: 每个字符串仅由字符 '0' 或 '1' 组成。 1 <= a.length, b.length <= 10

丶鹏 404

可爱宝宝力扣刷题集目录

阿勒八叉

zhuruihe2014的博客 941

【LeetCode】67. 二进制求和

本文介绍了二进制字符串相加的算法实现。核心思路是从字符串末尾开始逐位相加,处理进位情况。最优解法是双指针+进位法,时间复杂度O(max(m,n)),空间复杂度O(1)。文中详细分析了四种典型情况,并比较了不同算法的优劣,推荐使用双指针法配合字符串构建器实现高效计算。关键点在于正确处理进位和处理不同长度字符串的边界条件。

qq_32019341的博客 1151

力扣刷题篇之数与位1

今天把数与位的第一个部分,进制转换做完了,感觉大部分都是简单题,仔细想想也能自己敲出来,需要注意的是一些回文数和进制的处理需要牢记。多敲!

m0_66076989的博客 448

力扣简单题系列:x 的平方根(LeetCode 69)

力扣第69题 x的平方根

weixin_53910667的博客 1846

leetcode-67.二进制求和

leetcode-67.二进制求和 Points 数组 数学 题意 给定两个二进制字符串,返回他们的和(用二进制表示)。 输入为非空字符串且只包含数字1和0。 示例1: 输入: a = "11", b = "1" 输出: "100" 示例2: 输入: a = "1010", b = "1011" 输出: "10101" 示例 3:(自己加的)...

yocichen 123

LeetCode 从零单刷个人笔记整理(持续更新)

更新至2019.4.19 本人博客用于个人对知识点的记录和巩固。之前刷了《剑指Offer》,基本每道题都用两种语言过了一遍,比较用心地进行原理和方法的剖析,并且用几乎所有可行的方法进行了实现和调优,大多数题目都附上了测试用例,少数题目进行了一些升级和扩充。感兴趣的话可以看这里:#程序员面试必备#《剑指Offer》从零单刷个人笔记整理(66题全) 刷完剑指Offer后下一步就是LeetCode了。下...

NJU_ChopinXBP的博客 4302
上一篇: LeetCode刷题之旅(简单-15):加一
下一篇: FAQ(86):Ubuntu 下 idea 配置git 报错:Failed to start Git process error=13, Permission denied.
后台技术汇
博客等级 码龄11年 670粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值