力扣 第415题 字符串相加 与 第67题 二进制求和

力扣 第415题 字符串相加 与第67题 二进制求和

  • 第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,将方法名修改后,就测试成功了

测试代码结果正确并可提交

力扣 第415题 字符串相加 与 第67题 二进制求和_第1张图片

第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();
    }

测试代码结果正确并可提交

力扣 第415题 字符串相加 与 第67题 二进制求和_第2张图片

你可能感兴趣的:(力扣)