力扣 第415題 字符串相加 與 第67題 二進制求和

第415題 字符串相加

題目

給定兩個字符串形式的非負整數 num1 和num2 ,計算它們的和。

注意:

num1 和num2 的長度都小於 5100.
num1 和num2 都只包含數字 0-9.
num1 和num2 都不包含任何前導零。
你不能使用任何內建 BigInteger 庫, 也不能直接將輸入的字符串轉換爲整數形式。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-strings
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

暴力版

對相對短的字符串,前面用零補齊
然後拆分爲單字符串進行累加求和
    public static String addStrings(String num1, String num2) {
        //取得兩個字符串的長度
        int sc1 = num1.length();
        int sc2 = num2.length();
        int diff = sc1 - sc2;
        StringBuilder sb = new StringBuilder();
        //對長度短的字符串前面填零補齊
        if (diff > 0) {
            for (int i = 0; i < diff; i++) {
                sb.append("0");
            }
            sb.append(num2);
            num2 = sb.toString();
        } else {
            diff = -diff;
            for (int i = 0; i < diff; i++) {
                sb.append("0");
            }
            sb.append(num1);
            num1 = sb.toString();
        }
        //將字符串分割爲字符數組
        char[] cs1 = num1.toCharArray();
        char[] cs2 = num2.toCharArray();
        int flag = 0;
        String sum = "";
        for (int i = cs1.length - 1; i >= 0; i--) {
            //如果和大於10,則 和減去10,且 進位爲1
            if (flag + cs1[i] - 48 + cs2[i] - 48 >= 10) {
                sum = (flag + cs1[i] - 48 + cs2[i] - 48 - 10) + sum;
                flag = 1;
            } else {
                //如果和小於10,則進位爲0
                sum = (flag + cs1[i] - 48 + cs2[i] - 48) + sum;
                flag = 0;
            }
        }
        //對最後的進位進行處理
        if (flag == 1) {
            sum = 1 + sum;
        }
        return sum;
    }

進階版

    public static String addStrings2(String num1, String num2) {
        int jinwei = 0;
        //賦值兩個字符串的長度
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        StringBuilder sb = new StringBuilder();
        while (i >= 0 || j >= 0 || jinwei > 0){
            //取得各個位數的值
            int aNum = i>=0 ? num1.charAt(i--) - '0':0;
            int bNum = j>=0 ? num2.charAt(j--) - '0':0;
            //計算數組a和數組b中 對應位置值與 進位 的和
            sb.append((aNum + bNum + jinwei) % 10);
            //進位
            jinwei = (aNum + bNum + jinwei) / 10;
        }
        //倒敘輸出
        return sb.reverse().toString();
    }

遇見的錯誤

Line 10: error: cannot find symbol [in __Driver__.java]

錯誤原因:
檢查發現在自己本地測試用的方法名爲addStrings2,而力扣給定的默認名爲addStrings,將方法名修改後,就測試成功了

測試代碼結果正確並可提交

在這裏插入圖片描述

第67題 二進制求和

題目

給定兩個二進制字符串,返回他們的和(用二進制表示)。

輸入爲非空字符串且只包含數字 1 和 0。

示例 1:

輸入: a = "11", b = "1"
輸出: "100"
示例 2:
輸入: a = "1010", b = "1011"
輸出: "10101"

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-binary
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

思路與上題一樣,直接優化版

    public static String addBinary(String a, String b) {
        int jinwei = 0;
        int i = a.length() - 1;
        int j = b.length() - 1;
        StringBuilder sb = new StringBuilder();
        while (i >= 0 || j >= 0 || jinwei > 0){
            int aNum = i>=0 ? a.charAt(i--) - '0':0;
            int bNum = j>=0 ? b.charAt(j--) - '0':0;
            sb.append((aNum + bNum + jinwei) % 2);
            jinwei = (aNum + bNum + jinwei) / 2;
        }
        return sb.reverse().toString();
    }

測試代碼結果正確並可提交

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章