leetcode add_binary 采坑记
发布时间:2020-12-14 04:16:15 所属栏目:大数据 来源:网络整理
导读:尽管add_binary在leetcode中是一个简单难度,但是踩了不少坑,记录一下 描述: 给两个字符串形式的二进制数,要求求和并输出字符串形式的结果,其中a和b均不为空字符串 样例: a=“1010”,b="1011",输出“10101”. ? 过程: 刚看到题目的时候觉得很简单,
尽管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]+","+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了,感觉很是坑啊 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |