leetcode add_binary 采坑记
尽管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 采坑记的更多相关文章
- 分布式改造剧集之Redis缓存采坑记
Redis缓存采坑记 前言 这个其实应该属于分布式改造剧集中的一集(第一集见前面博客:http://www.cnblogs.com/Kidezyq/p/8748961.html),本来按照顺序 ...
- Spring Cloud Config采坑记
1. Spring Cloud Config采坑记 1.1. 问题 在本地运行没问题,本地客户端服务能连上本地服务端服务,可一旦上线,发现本地连不上线上的服务 服务端添加security登录加密,客户 ...
- k8s采坑记 - 解决二进制安装环境下证书过期问题
前言 上一篇k8s采坑记 - 证书过期之kubeadm重新生成证书阐述了如何使用kubeadm解决k8s证书过期问题. 本篇阐述使用二进制安装的kubernetes环境,如何升级过期证书? k8s配置 ...
- Redis适配采坑记
Redis适配采坑记 相对于其他的适配,Redis可以说是非常简单的其中只发现一个坑 问题一: 问题描述: redis认证失败 问题详解: redis连接配置时,本地需要采用password属性,远程 ...
- tk.mybatis通用工具采坑记
tk.mybatis通用工具pom <!--mybatis依赖--> <dependency> <groupId>org.mybatis.spring.boot&l ...
- dubbo初学采坑记
写在前面的话 dubbo 现在是apache组织旗下的项目,相信国内也有很多人使用.最近一个同事离职,我就接手了他的项目.远程通讯就是用的dubbo框架来实现的.使用Intelij idea 写了一个 ...
- Service worker (@nuxtjs/workbox) 采坑记
PWA(Progressive Web App)是前端的大趋势,它能极大的加快前端页面的加载速度,得到近乎原生 app 的展示效果(其实难说).PWA 其实是多种前端技术的组合,其中最重要的一个技术就 ...
- aidl使用采坑记
什么是AIDL? AIDL是 Android Interface definition language的缩写,它是一种Android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口 A ...
- css选择器:first-child和nth-child 采坑记
今天想用nth-child来给一个类似于树的目录(bootstrap-nav-tree 一个angularjs插件)设置不同的颜色,结构大致类似于 <ul> <li class=& ...
随机推荐
- W3School学习网站
http://www.w3school.com.cn/tags/att_form_autocomplete.asp
- S/4HANA业务角色概览之订单到收款篇
大家好我叫Sean Zhang,中文名张正永.目前在S/4HANA产品研发部门任职产品经理,而这一阶段要从2017年算起,而在那之前接触更多还是技术类的,比如做过iOS.HANA.ABAP.UI5等等 ...
- Linux-python的一些小问题
1.python版本和pip版本 2.PATH和PYTONPATH 1.python版本和pip版本 1.python版本 一般Ubuntu里面都装的不止一个版本的python,比如有python2. ...
- UEditor 中配置可以跨域访问的图片路径
文档里很清楚:http://fex.baidu.com/ueditor/#server-path 进入配置文件 当域名不是直接配置到项目根目录时,例:http://a.com/b/c 域名下有两文件 ...
- Java中父类强制转换为子类的可能
之前徒弟问了一个问题, 在Java中, 父类对象到底能不能转换成对应的子类对象? 到底能不能, 今天就来说说这个问题, 先看下面一段代码: package cn.com.hanbinit.test; ...
- C#图解教程读书笔记(第5章 方法)
类型推断和var关键字 从C#3.0开始,可以在变量声明的开始部分的的位置使用新的关键字var. Var关键字并不是某种特别类型的符号.它只是句法上的速记,表示任何可以从初始化的右边推断出的类型. V ...
- IntelliJ IDEA 运行你的第一个Java应用程序
IntelliJ IDEA 运行你的第一个Java应用程序创建项目让我们创建一个简单的Java Hello World项目. 单击创建新的项目. 打开新建项目向导.你应该注意的主要是项目的SDK.SD ...
- 区间DP学习总结
这段时间学习了区间DP,所以试着把学到的东西稍作总结,以备不时之需. 学习区间DP首先要弄清区间DP是为了解决什么问题:一般的DP主要是特征是一次往往只操作一个数值或者存储可以不连续的物品的状态(比如 ...
- Android HttpClient自己主动登陆discuz论坛!
你登陆论坛的时候,我们先看看浏览器干了什么事儿: 用Firefox打开HiPda 的登陆页面,输入用户名和password,点登陆. 以下是通过firebug插件获取的数据: 能够看到浏览器这个htt ...
- Codeforces Round #533 (Div. 2) C. Ayoub and Lost Array 【dp】
传送门:http://codeforces.com/contest/1105/problem/C C. Ayoub and Lost Array time limit per test 1 secon ...