leetcode add_binary 採坑記
阿新 • • 發佈:2018-11-04
儘管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了,感覺很是坑啊