leetcode add_binary 采坑记
Posted leavemealone
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 采坑记的主要内容,如果未能解决你的问题,请参考以下文章