尽管add_binary在leetcode中是一个简单难度,但是踩了不少坑,记录一下

描述:

给两个字符串形式的二进制数,要求求和并输出字符串形式的结果,其中a和b均不为空字符串

样例:

a=“1010”,b="1011",输出“10101”.

过程:

刚看到题目的时候觉得很简单,只要每一位按位相加就好了,很容易写出第一版代码

public class AddBinary {
public String add_binary(String a,String b){
char[] chars_a = a.toCharArray();
char[] chars_b = b.toCharArray(); int c_out = 0; // 统计最长位数,将chars_a设置为最长的
int max_length = chars_a.length;
if(chars_a.length<chars_b.length){
max_length = chars_b.length;
char[] temp = chars_a;
chars_a = chars_b;
chars_b = temp;
} // 设置结果长度为长的那个
char[] result = new char[max_length];
// 计算结果
for(int i=0;i<max_length;i++){
int t;
if(i<chars_b.length){
// 重合部分
t = chars_a[i]-'0'+chars_b[i]-'0'+c_out;
}else {
// 非重合部分
t = chars_a[i]+c_out;
}
if(t>1){
c_out = 1;
result[i]=(char)(t-2);
}else {
c_out=0;
result[i]=(char)t;
}
}
StringBuilder stringBuilder = new StringBuilder();
if(c_out!=0){
stringBuilder.append(1);
}
stringBuilder.append(result);
return stringBuilder.toString();
}
}

  开心的测试了一下,结果输出的是什么东西,还有空白符,这就是不严谨的问题了,在设置result[i]的时候没有考虑到再加上‘0’的ASCII码值,导致输出的是0或者1对应的ASCII值结果,实验第二版代码

public class AddBinary {
public String add_binary(String a,String b){
char[] chars_a = a.toCharArray();
char[] chars_b = b.toCharArray(); int c_out = 0; // 统计最长位数,将chars_a设置为最长的
int max_length = chars_a.length;
if(chars_a.length<chars_b.length){
max_length = chars_b.length;
char[] temp = chars_a;
chars_a = chars_b;
chars_b = temp;
} // 设置结果长度为长的那个
char[] result = new char[max_length];
// 计算结果
for(int i=0;i<max_length;i++){
int t;
if(i<chars_b.length){
// 重合部分
t = chars_a[i]-'0'+chars_b[i]-'0'+c_out;
}else {
// 非重合部分
t = chars_a[i]-'0'+c_out;
}
if(t>1){
c_out = 1;
result[i]=(char)(t-2+'0');
}else {
c_out=0;
result[i]=(char)(t+'0');
}
}
StringBuilder stringBuilder = new StringBuilder();
if(c_out!=0){
stringBuilder.append(1);
}
stringBuilder.append(result);
return stringBuilder.toString();
}
}

  结果显示都是数字了没问题,但是计算的结果为什么出错了,原因在于String.toCharArray(),是按照从左向右的顺序读入的,即第零位是二进制数的最高为,相当于反了过来,所以第三版代码出现了

public class AddBinary {
public String add_binary(String a,String b){
char[] chars_a = a.toCharArray();
char[] chars_b = b.toCharArray(); int c_out = 0; // 统计最长位数,将chars_a设置为最长的
int max_length = chars_a.length;
if(chars_a.length<chars_b.length){
max_length = chars_b.length;
char[] temp = chars_a;
chars_a = chars_b;
chars_b = temp;
} // 设置结果长度为长的那个
char[] result = new char[max_length];
// 计算结果
for(int i=0;i<max_length;i++){
int t;
if(i<chars_b.length){
// 重合部分
t = chars_a[max_length-i-1]-'0'+chars_b[chars_b.length-i-1]-'0'+c_out;
System.out.println(chars_a[max_length-i-1]+","+chars_b[chars_b.length-i-1]+","+c_out+","+t);
}else {
// 非重合部分
t = chars_a[max_length-i-1]-'0'+c_out;
System.out.println(chars_a[max_length-i-1]+","+c_out+","+t);
}
if(t>1){
c_out = 1;
result[max_length-i-1]=(char)(t-2+'0');
}else {
c_out=0;
result[max_length-i-1]=(char)(t+'0');
}
}
StringBuilder stringBuilder = new StringBuilder();
if(c_out!=0){
stringBuilder.append(1);
}
stringBuilder.append(result);
return stringBuilder.toString();
}
}

  总算是ac了,感觉很是坑啊

leetcode add_binary 采坑记的更多相关文章

  1. 分布式改造剧集之Redis缓存采坑记

    Redis缓存采坑记 ​ 前言 ​ 这个其实应该属于分布式改造剧集中的一集(第一集见前面博客:http://www.cnblogs.com/Kidezyq/p/8748961.html),本来按照顺序 ...

  2. Spring Cloud Config采坑记

    1. Spring Cloud Config采坑记 1.1. 问题 在本地运行没问题,本地客户端服务能连上本地服务端服务,可一旦上线,发现本地连不上线上的服务 服务端添加security登录加密,客户 ...

  3. k8s采坑记 - 解决二进制安装环境下证书过期问题

    前言 上一篇k8s采坑记 - 证书过期之kubeadm重新生成证书阐述了如何使用kubeadm解决k8s证书过期问题. 本篇阐述使用二进制安装的kubernetes环境,如何升级过期证书? k8s配置 ...

  4. Redis适配采坑记

    Redis适配采坑记 相对于其他的适配,Redis可以说是非常简单的其中只发现一个坑 问题一: 问题描述: redis认证失败 问题详解: redis连接配置时,本地需要采用password属性,远程 ...

  5. tk.mybatis通用工具采坑记

    tk.mybatis通用工具pom <!--mybatis依赖--> <dependency> <groupId>org.mybatis.spring.boot&l ...

  6. dubbo初学采坑记

    写在前面的话 dubbo 现在是apache组织旗下的项目,相信国内也有很多人使用.最近一个同事离职,我就接手了他的项目.远程通讯就是用的dubbo框架来实现的.使用Intelij idea 写了一个 ...

  7. Service worker (@nuxtjs/workbox) 采坑记

    PWA(Progressive Web App)是前端的大趋势,它能极大的加快前端页面的加载速度,得到近乎原生 app 的展示效果(其实难说).PWA 其实是多种前端技术的组合,其中最重要的一个技术就 ...

  8. aidl使用采坑记

    什么是AIDL? AIDL是 Android Interface definition language的缩写,它是一种Android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口 A ...

  9. css选择器:first-child和nth-child 采坑记

    今天想用nth-child来给一个类似于树的目录(bootstrap-nav-tree  一个angularjs插件)设置不同的颜色,结构大致类似于 <ul> <li class=& ...

随机推荐

  1. 《Tomcat与Java Web开发技术详解》思维导图

    越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...

  2. Simotion 绝对值编码器使用外部开关回零

    问题来源: 西门子的1FK7二代电机,目前已经没有增量编码器.标准的编码器选项是单圈绝对值,或多圈绝对值. 在某些应用中,如印刷机的版辊.模切轴.飞剪电机等,需要使用外部开关来回零.下文描述了使用外部 ...

  3. SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解

    (1) 在SAP CRM里创建一个Lead后,会观察到有一个Opportunity自动生成,这是通过什么后台逻辑实现的呢? 检查前台日志或者后台事务码SLG1,发现有很多属于用户WF-BATCH的日志 ...

  4. IntelliJ IDEA 2017.3-2018.1 全系列汉化包

    JetBrains 系列软件汉化包 关键字: Android Studio 3.0-3.1 汉化包 GoLand 2017.3.2-2018.1 汉化包 IntelliJ IDEA 2017.3-20 ...

  5. 关于Struts2中的ognl-2.6.11.jar和ognl-2.7.3.jar解决思路

    关于Struts2中的ognl-2.6.11.jar和ognl-2.7.3.jar建了一个简单的工程:导入的jar包有六个,包括commons-fileupload-1.2.1.jarcommons- ...

  6. Task ‘run’ not found in root project

    问题现象: Task 'run' not found in root project 'springframework'. 问题原因: 没有在gradle.build文件中添加如下配置, mainCl ...

  7. 在编译器中调试spark程序处理

    在IDEA中调试spark程序会报错 18/05/16 07:33:51 WARN NativeCodeLoader: Unable to load native-hadoop library for ...

  8. PHP-----TP框架基础

    TP框架基础 把Thinkphp框架的压缩包解压到php文件夹下----www目录下.   Thinkphp文件夹都有什么呢??? (所有用TP框架做的程序,要访问程序里面的网页.内容的话,全部要走这 ...

  9. Linux关于压缩和解压缩实例

    在谈到压缩和解压缩,我想说说它们的应用场景,其实它们主要的应用场景是有这么几个方面? (1)备份(几十个数据库每天进行备份,即包含数据又包含脚本,还有其他十分重要的日志文件等等); (2)降低服务器存 ...

  10. Redis(RedisTemplate)使用hash哈希

    RedisTemplate配置:https://www.cnblogs.com/weibanggang/p/10188682.html package com.wbg.springRedis.test ...