LeetCode算法题-Add Strings(Java实现)

这是悦乐书的第223次更新,第236篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第90题(顺位题号是415)。给定两个非负整数num1和num2表示为字符串,返回num1和num2的总和。

注意:

  • num1和num2的长度均<5100。
  • num1和num2都只包含数字0-9。
  • num1和num2都不包含任何前导零。
  • 您不能使用任何内置BigInteger库或直接将输入转换为整数。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

从后向前依次获取两个字符串的字符,转成int类型,然后做加法得到和,利用对10取余将余数添加进字符串的第一位,然后需要计算进位,直接将和除以10,就是可能存在的进位。

在循环的判断条件中,还需要判断进位是否等于1,因为有可能最高位会存在进位,不然会存在误差。

两个字符串的长度不能保证相等,所以索引从后往前递减时,两索引大于等于0是或的关系。

在通过索引取对应位置的字符时,也要判断是否大于等于0,不满足就取默认值0。

public String addStrings(String num1, String num2) {
    int len = num1.length()-1;
    int len2 = num2.length()-1;
    int count = 0;
    StringBuilder sb = new StringBuilder();
    for (int i=len, j=len2; i>=0 || j>=0 || count == 1; i--,j--) {
        int n = i >= 0 ? num1.charAt(i)-'0' : 0;
        int n2 = j >= 0 ? num2.charAt(j)-'0' : 0;
        int sum = n + n2 + count;
        sb.insert(0, sum%10);
        count = sum/10;
    }
    return sb.toString();
}

03 第二种解法

和第一种解法的思路一样,只是将for循环换成了while循环,没有始终在第一位插入,而是最后通过反转完成。

public String addStrings2(String num1, String num2) {
    int i = num1.length()-1;
    int j = num2.length()-1;
    int carry = 0;
    StringBuilder sb = new StringBuilder();
    while (i>=0 || j>=0 || carry == 1) {
        int n = i >= 0 ? num1.charAt(i)-'0' : 0;
        int n2 = j >= 0 ? num2.charAt(j)-'0' : 0;
        int sum = n + n2 + carry;
        sb.append(sum%10);
        carry = sum/10;
        i--;
        j--;
    }
    return sb.reverse().toString();
}

04 小结

算法专题目前已连续日更超过两个月,算法题文章90+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

    原文作者:悦乐书
    原文地址: https://www.jianshu.com/p/c786b69ca660
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞