尽管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. centos 6 YUM安装 lnmp

    准备篇: 1.配置防火墙,开启80端口.3306端口       vi /etc/sysconfig/iptables       -A INPUT -m state --state NEW -m t ...

  2. 获取Excel的单元格数据类型(靠谱)

    VBA中,单元格属性有NumberFormat可以获取单元格格式,比如: G/通式格式→常规 @→文本 yyyy/m/d→日期 问题: G/通式格式,无法知道值是整数还是浮点数, yyyy/m/d如果 ...

  3. ssh配置调试的必杀技

    我们知道,ssh客户端的文件及文件夹的权限会影响到身份验证是否通过,可能又不告诉我们为什么,这真是件烦心了事 所以,服务器调试执行就可以看到很多错误信息了 /usr/sbin/sshd -d -p 2 ...

  4. LSF作业管理系统使用方法

    查看LSF计算节点列表bhosts # bhosts HOST_NAME STATUS JL/U MAX NJOBS RUN SSUSP USUSP RSV fat01 ok - 16 0 0 0 0 ...

  5. PHP 判断常量,变量和函数是否存在

    判断变量是否被定义:defined() if (defined('CONST_NAME')) { //do something } 判断变量是否存在:isset() ,注意变量未声明或声明时赋值为NU ...

  6. (第二场)D Money 【dp\贪心】

    题目:https://www.nowcoder.com/acm/contest/140/D 题目描述: White Cloud has built n stores numbered from 1 t ...

  7. fc全连接层的作用、卷积层的作用、pooling层、激活函数的作用

    fc:1.起到分类器的作用.对前层的特征进行一个加权和,(卷积层是将数据输入映射到隐层特征空间)将特征空间通过线性变换映射到样本标记空间(也就是label) 2.1*1卷积等价于fc:跟原featur ...

  8. 由.def文件生成lib文件[转]

    最近在学习curl库时,碰到一个问题,从官网上下载了一个lib版的,却发现只有.dll,没有lib文件,感觉很奇怪,google了之后才知道,原来库作者的用意是让用户自己生成lib文件,下载到的lib ...

  9. socket相关的开机初始化分析

    针对内核3.9 系统开启时,会使用init/main.c,然后再里面调用kernel_init(),在里面会再调用do_basic_setup(),调用do_initcalls(),调用do_one_ ...

  10. Vue.js-简单的增删查功能

    1.Vue.js是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图 ...