尽管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. Struts2学习-json

    Struts2 实现JSON输出有2种办法1.把Action变成Servlet,使用传统做法2.使用Struts 内置功能完成 二. 1.导入配置,pom.xml,要去struts2的官网下载mvnr ...

  2. Java日志系统

    前言 各组件之间的关系: slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实 ...

  3. c# HttpWebRequest与HttpWebResponse

    [转]c# HttpWebRequest与HttpWebResponse 绝技 如果你想做一些,抓取,或者是自动获取的功能,那么就跟我一起来学习一下Http请求吧. 本文章会对Http请求时的Get和 ...

  4. 洛谷 P4321 【随机漫游】

    题目大意 给出\(n(n\leq 18)\)个点的无向连通图,\(m(m\leq 10^5)\)次询问.每次询问给出一个点集和一个起点\(s\),询问从\(s\)出发,经过这个点集中的每一个点至少一次 ...

  5. poj 3253 Fence Repair (STL优先队列)

    版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/34805369 转载请注明出 ...

  6. zip 函数

    zip 函数,看上去是打包的意思,其实功能是将多个可迭代对象,组合成一个个元组. zip(iter1,iter2) a,b = zip(*zip(iter1,iter2)) a = [1,2,3] b ...

  7. 同步Internet时间

    问题: 开启了  自动设置时间,时区  但问题仍然存在 回答: 勾选并不代表真正同步成功  执行timedate.cpl如图设置 记得点击立即更新  时间不同步可能是时间服务器问题 换一个就可以了

  8. 小BAT解决大麻烦_某卡教室控制软件

    @echo off mode con cols= lines= if "%1" == "h" goto begin mshta vbscript:)(windo ...

  9. 面试准备——(二)专业知识(1)Linux

    面试的问题: 腾讯: 1. 查看进程的命令 美团: 1. 常用的命令——美团/滴滴 2. 如何在性能测试的时候查看进程 3. kill -9/-15区别 滴滴: 1.如何找到一个特定文件 2. 如何替 ...

  10. alibaba--java规范

    18. [推荐]final 可以声明类.成员变量.方法.以及本地变量,下列情况使用 final 关键字: 1) 不允许被继承的类,如:String 类. 2) 不允许修改引用的域对象,如:POJO 类 ...