LeetCode-二進位制求和
阿新 • • 發佈:2018-11-06
LeetCode-二進位制求和
Table of Contents
1 Easy-二進位制求和
1.1 題目描述
給定兩個二進位制字串,返回他們的和(用二進位制表示)。
輸入為非空字串且只包含數字 1 和 0。
1.2 示例 1:
輸入: a = "11", b = "1"
輸出: "100"
1.3 示例 2:
輸入: a = "1010", b = "1011"
輸出: "10101"
2 自己的解答
2.1 思路
- 使用a和b中較長者作為迴圈終止條件,遍歷a和b字串.逆序遍歷,比較符合普通人理解的二進位制求和方法.
- 定義一個變數up,表示是否有進位,'1'為有進位,'0'為沒有進位.
- 將a和b當前位置的字元加上進位符up,再減去兩個'0'字元,即得到當前位的和c.
- 如果當前位的和c大於'2',說明有進位,將up更新為'1'.並將c減去'2'之後插入到StringBuilder變數的首端.
- 如果當前位置的和c小於'2',說明沒有進位,將up更新為'0',並將c插入到StringBuilder變數的首端.
- 當a和b其中一方已經遍歷完後,未遍歷完的一方放入StringBuilder變數的首端,同時要判斷是否由進位.
- 在迴圈結束之後,如果進位符沒有被恢復為'0',說明最後有進位,需要在StringBuilder變數首端插入'1'.
2.2 反思
- 思路是正確的,但是實現起來太過複雜.
- 以後遇到此種情況可以轉換思路,如果操作String不方便,可以將String變為int,來計算二進位制的和.
- 例如:用int變數sum記錄a和b對應位置字元的和,然後sum%2就是當前位置字元的int形式,並將其新增到StringBuilder中.是否有進位可以通過sum/2判斷,並可以將carry作為下一次sum的初始值.
2.3 程式碼
2.3.1 自己的程式碼
package algorithm.easy; public class AddBinary { public static String solution(String a, String b) { StringBuilder sb = new StringBuilder(); int alen = a.length(); int blen = b.length(); int N = alen > blen ? alen : blen; char up = '0'; char c = ' '; for (int i = 1; i <= N; i++) { int ai = a.length() - i; int bi = b.length() - i; if (ai < 0) { // b比a長 // 有上一位的進位 if (up == '1') { c = (char) (b.charAt(bi) + up - '0'); if (c < '2') { sb.insert(0, c); // 恢復上一位進位 if (up != '0') { up = '0'; } } else { if (up != '1') { // 有進位 up = '1'; } sb.insert(0, '0'); } continue; } else { // 沒進位,直接把剩餘的字串插入即可 sb.insert(0, b.substring(0, bi + 1)); break; } } if (bi < 0) { // a比b長 // 有上一位的進位 if (up == '1') { c = (char) (a.charAt(ai) + up - '0'); if (c < '2') { sb.insert(0, c); // 恢復上一位進位 if (up != '0') { up = '0'; } } else { if (up != '1') { // 有進位 up = '1'; } sb.insert(0, '0'); } continue; } else { // 沒進位,直接把剩餘的字串插入即可 sb.insert(0, a.substring(0, ai + 1)); break; } } c = (char) (a.charAt(ai) + b.charAt(bi) + up - '0' - '0'); if (c < '2') { // 插入到sb中 sb.insert(0, c); // 恢復上一位進位 if (up != '0') { up = '0'; } } else { if (up != '1') { // 有進位 up = '1'; } c = (char) (c - '2' + '0'); // 插入到sb中 sb.insert(0, c); } } // 到最後還有進位,則插入1一個1,否則不插入 if (up == '1') { sb.insert(0, '1'); } return sb.toString(); } public static void main(String[] args) { System.out.println(solution("1010","1011")); System.out.println(solution("11","1")); System.out.println(solution("110","110010")); System.out.println(solution("101111","10")); System.out.println(solution("0", "0")); System.out.println(solution("100", "110010")); } }
2.3.2 別人的程式碼
class Solution { public String addBinary(String a, String b) { StringBuilder sb = new StringBuilder(); int i = a.length() - 1; int j = b.length() - 1; int carry = 0; while (i >= 0 || j >= 0) { int sum = carry; if (i >= 0) { sum += (a.charAt(i) - '0'); i--; } if (j >= 0) { sum += (b.charAt(j) - '0'); j--; } sb.append(sum % 2); carry = sum / 2; } if (carry != 0){ sb.append(1); } return sb.reverse().toString(); } }
Date: 2018-11-06 21:00
Created: 2018-11-06 二 21:00