• 举一反三刷穿字符串加减法类型题目:牛客BM86 大数加法、LeetCode-445. 两数相加 II、LeetCode-2. 两数相加


    目录

    BM86 大数加法

    题目:BM86 大数加法

    思路:

    代码:

    2. 两数相加

    题目:2. 两数相加

    思路:

    代码:

    445. 两数相加 II

    题目:445. 两数相加 II

    思路:

    代码

    这三个题是一个类型的题,应该秒解;

    BM86 大数加法

    题目:BM86 大数加法

    以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回;

    数据范围:s.length,t.length≤100000,字符串仅由'0'~‘9’构成

    要求:时间复杂度 O(n)

    示例1

    输入:

    "1","99"

    返回值:

    "100"

    说明:

    1+99=100      

    示例2

    输入:

    "114514",""

    返回值:

    "114514"

    思路

    • 大整数相加,就可以按照整数相加的方式,从个位开始,逐渐往上累加,换到字符串中就是从两个字符串的末尾开始相加;
    • 因为s.charAt(i) - 'A' + 'a'是数字;
    • 循环条件是两个字符串不都为空,或存在进位
    • 判断索引是否到0了,小于等于0之后都是0;
    • 从低位到高位进行计算;
    • 所以最后需要反过来;reverse()方法;
    • 注意长度与索引的关系,是-1的;

    代码:

    1. import java.util.*;
    2. public class Solution {
    3. public String solve (String s, String t) {
    4. if (s.length() == 0)return t;
    5. if (t.length() == 0)return s;
    6. int carry = 0;
    7. StringBuilder res = new StringBuilder();
    8. int i1 = s.length(), i2 = t.length();
    9. while (i1 > 0 || i2 > 0 || carry > 0) {
    10. int a = (i1 > 0) ? s.charAt(i1 - 1) - '0' : 0;
    11. int b = (i2 > 0) ? t.charAt(i2 - 1) - '0': 0;
    12. int cur = a + b + carry;
    13. carry = cur / 10;
    14. cur %= 10;
    15. res.append(cur);
    16. i1--;
    17. i2--;
    18. }
    19. return res.reverse().toString();
    20. }
    21. }

    2. 两数相加

    题目:2. 两数相加

    给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

    请你将两个数相加,并以相同形式返回一个表示和的链表。

    你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    示例 1:

    输入:l1 = [2,4,3], l2 = [5,6,4]

    输出:[7,0,8]

    解释:342 + 465 = 807.

    示例 2:

    输入:l1 = [0], l2 = [0]

    输出:[0]

    示例 3:

    输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]

    输出:[8,9,9,9,0,0,0,1]

    提示:

    • 每个链表中的节点数在范围 [1, 100] 内
    • 0 <= Node.val <= 9
    • 题目数据保证列表表示的数字不含前导零

    思路

     和上面那个题一模一样,只是换成了链表而已

    代码:

    1. class Solution {
    2. public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    3. // 使用预先指针的目的在于链表初始化时无可用节点值,而且链表构造过程需要指针移动,进而会导致头指针丢失,无法返回结果
    4. // pre就是为了指向头结点,cur是需要新建并一直移动往前走的
    5. ListNode pre = new ListNode(0);
    6. ListNode cur = pre;
    7. int carry = 0;
    8. while (l1 != null || l2 != null|| carry!=0) {
    9. // 有可能l1或l2是空,所以需要进行补零操作
    10. int x = l1 == null ? 0 : l1.val;
    11. int y = l2 == null ? 0 : l2.val;
    12. int sum = x + y + carry;
    13. // 每一位计算的同时需要考虑上一位的进位问题,而当前位计算结束后同样需要更新进位值
    14. carry = sum / 10;
    15. sum = sum % 10;
    16. // 将sum作为cur的下一个新建的值
    17. cur.next = new ListNode(sum);
    18. // 往前移动cur
    19. cur = cur.next;
    20. if (l1 != null)
    21. l1 = l1.next;
    22. if (l2 != null)
    23. l2 = l2.next;
    24. }
    25. return pre.next;
    26. }
    27. }

    445. 两数相加 II

    题目:445. 两数相加 II

    给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

    你可以假设除了数字 0 之外,这两个数字都不会以零开头;

    示例1:

    输入:l1 = [7,2,4,3], l2 = [5,6,4]

    输出:[7,8,0,7]

    示例2:

    输入:l1 = [2,4,3], l2 = [5,6,4]

    输出:[8,0,7]

    示例3:

    输入:l1 = [0], l2 = [0]

    输出:[0]

    提示:

    • 链表的长度范围为 [1, 100];
    • 0 <= node.val <= 9;
    • 输入数据保证链表代表的数字无前导 0;

    思路

     思路还是一样,只不过需要先使用栈逆序处理;

    代码:

    1. import java.util.Deque;
    2. import java.util.LinkedList;
    3. class Solution {
    4. public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    5. Deque stack1 = new LinkedList();
    6. Deque stack2 = new LinkedList();
    7. while (l1 != null) {
    8. stack1.push(l1.val);
    9. l1 = l1.next;
    10. }
    11. while (l2 != null) {
    12. stack2.push(l2.val);
    13. l2 = l2.next;
    14. }
    15. int carry = 0;
    16. ListNode pre= null;
    17. while (!stack1.isEmpty() || !stack2.isEmpty() || carry != 0) {
    18. int a = stack1.isEmpty() ? 0 : stack1.pop();
    19. int b = stack2.isEmpty() ? 0 : stack2.pop();
    20. int cur = a + b + carry;
    21. carry = cur / 10;
    22. cur %= 10;
    23. ListNode newnode = new ListNode(cur);
    24. newnode.next = pre;
    25. pre= newnode;
    26. }
    27. return ans;
    28. }
    29. }

  • 相关阅读:
    C++(11):to_string及stoi
    软件幂等性(Software Idempotence)
    【LeetCode】1154.一年中的第几天
    6. PUCCH传输的信息
    9.spark自适应查询-AQE之动态调整Join策略
    Pytorch torch.split()的简单用法
    OpenCV实战案例——车道线识别
    MySQL作业1
    java实现获取钉钉的签到记录
    恶臭数字论证器 -- 简化版
  • 原文地址:https://blog.csdn.net/jiayoudangdang/article/details/125871972