当前位置: 首页 > news >正文

【leetcode】字符串,链表的进位加法与乘法


📚️前言

🌟 本期内容亮点:我们将深入解析力扣(LeetCode)上的几道经典算法题,涵盖不同难度和题型,帮助大家掌握解题思路和代码实现技巧。无论是准备面试还是提升算法能力,这些题解都能为你提供实用参考~

🌈 更多精彩内容:

欢迎访问小编的主页:GGBondlctrl-CSDN博客(点击跳转)
主页涵盖数据结构、算法、编程竞赛、面试经验等丰富内容,持续更新中!
🔥 你的支持很重要:
如果觉得内容对你有帮助,别忘了点赞👍 + 收藏⭐!你的鼓励是小编持续创作优质内容的动力~

🎆 直接进入正题:下面我们将从题目描述、解题思路、代码实现(附详细注释)和复杂度分析等方面,逐一拆解这几道力扣题目,助你高效攻克算法难关!

 

目录

​编辑📚️前言

📚️1.字符串的相加

1.1题目描述

1.2题目解析

1.3题目代码

📚️2.链表相加

2.1题目描述

2.2题目解析

2.3题目代码

📚️3.字符串相乘

3.1题目描述

3.2题目解析

3.3题目代码

📚️4.总结


 

📚️1.字符串的相加

1.1题目描述

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

如下所示:

看到这里大致就知道了,这里的意思了吧,那么小编也不再进行过多的解释了;

1.2题目解析

首先,这里是不可以使用我们java中的库函数的,并且我们如果使用Integer进行字符串转化为整数,那么会有越界的情况,会超出所表示的范围;那么我们的思路只能是:一个一个位进行相加,然后得出的每一位数字进行字符串的拼接;

1.我们的计算方式是从右到左

2.获取两个字符串对应的位置的值,与进位的值进行相加

3.得到一个一个数后,计算进位以及我们要拼接的字符 

这道题比较简单小编大家可以去画图试试,小编就一笔进行带过了

1.3题目代码

代码如下所示:

class Solution {public String addStrings(String num1, String num2) {int i = num1.length() - 1;int j = num2.length() - 1;//进位int carry = 0;StringBuffer str = new StringBuffer();while (i >= 0 || j >= 0 || carry > 0) {int x = 0;int y = 0;if (i >= 0) {x = num1.charAt(i) - '0';i--;}if (j >= 0) {y = num2.charAt(j) - '0';j--;}int sum = x + y + carry;carry = sum / 10;str.append(sum % 10);}return str.reverse().toString();}
}

注意事项:这里要注意我们的循环的判断条件,以及我们在每次获取字符串对应位置的时候,指针的移动,以及进位的计算,和拼接的字符串;当然在最后我们要注意字符串拼接后的翻转

📚️2.链表相加

2.1题目描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。

给定两个这种链表,请生成代表两个整数相加值的结果链表。

数据范围:0≤n,m≤10000000≤n,m≤1000000,链表任意值 0≤val≤90≤val≤9
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

2.2题目解析

同理这里的实现方式其实和上面一道题的解题思路一致,但是这里的链表不能从后往前进行遍历,所以这里我们要进行链表的翻转

1.翻转链表,从左往右进行遍历相加

2.计算我们的两个链表对应值,以及进位加法

3.通过sum之和计算我们的应该添加的节点的值,以及我们的进位是多少

4.循环结束后再次进行翻转链表

2.3题目代码

 代码如下所示:

public ListNode addInList (ListNode head1, ListNode head2) {//进行链表的翻转head1 = reverse(head1);head2 = reverse(head2);//定义进位int carry = 0;ListNode newHead = new ListNode(0);ListNode cur = newHead;while(carry > 0 || head1 != null || head2 != null){//进行操作int x = 0;int y = 0;if(head1 != null){x = head1.val;head1 = head1.next;}if(head2 != null){y = head2.val;head2 = head2.next;}int sum = x + y + carry;carry = sum / 10;cur.next = new ListNode(sum % 10);cur = cur.next;}//再次进行翻转return reverse(newHead.next);}public ListNode reverse(ListNode head) {ListNode prev = null;while (head != null) {ListNode next = head.next; // 保存下一个节点head.next = prev;         // 反转当前节点的指针prev = head;              // prev 移动到当前节点head = next;              // head 移动到下一个节点}return prev; // prev 就是反转后的头节点}

📚️3.字符串相乘

3.1题目描述

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

3.2题目解析

这里肯定是不可以进行转化之后进行相乘的,那么还是使用进位相乘,但是这里还是有技巧的,除了按照数学方式,还有一种办法,如下所示;

所以我们可以先用一个数组,来获取 4  13  28  27   18

3.3题目代码

代码如下所示:
 

class Solution {public String multiply(String num1, String num2) {if(num1.equals("0") || num2.equals("0") ){return "0";}int cur1 = num1.length() - 1;int cur2 = num2.length() - 1;int[] count = new int[num1.length() + num2.length() - 1];for(int i = 0; i < num2.length() ; i++ ){for(int j = 0; j < num1.length(); j++){int num = (num1.charAt(cur1) - '0') * (num2.charAt(cur2) - '0');count[i + j] = count[i + j] + num;cur1 --;}cur1 = num1.length() - 1;cur2 --;}//此时已经将值存入到我们的数组中了,直接进行进位相加int t = 0;int cur3 = 0 ;String str = "";while(cur3 < count.length || t != 0){if(cur3 < count.length){t += count[cur3] ;cur3 ++;}str = String.valueOf(t % 10) + str;t /= 10;}return str;}
}

注意:这里进行存储的时候,我们可以根据i j 的不同数值来表示同一个数组中位置的值,最后进行进位相加的时候,和前面几道题逻辑基本一致小编就不再过多的进行赘述了;

📚️4.总结

📚 算法题解:字符串与链表数值运算

本期解析力扣经典算法题,重点讲解字符串和链表形式的数值运算问题:

1️⃣ 字符串相加(LeetCode 415)

  • 模拟竖式加法,逐位相加处理进位
  • 时间复杂度O(max(M,N)),空间复杂度O(1)

2️⃣ 链表相加(NC40)

  • 先反转链表后相加,再反转结果
  • 注意进位处理和节点创建
  • 时间复杂度O(M+N),空间复杂度O(1)

3️⃣ 字符串相乘(LeetCode 43)

  • 使用数组存储中间结果,避免直接转换
  • 双重循环计算乘积,最后处理进位
  • 时间复杂度O(M*N)

所有解法均避免使用内置大数库,适合面试准备和算法提升。完整代码见原文,包含详细注释和复杂度分析。

更多数据结构与算法内容欢迎访问博客主页,持续更新中!

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

😊😊  期待你的关注~~~

http://www.dtcms.com/a/276882.html

相关文章:

  • 贝叶斯状态空间神经网络:融合概率推理和状态空间实现高精度预测和可解释性
  • 新手向:使用Python构建高效的日志处理系统
  • Linux系统之iprdbg 命令详解
  • 12.4 内存隔离与保护
  • 《Llama: The Llama 3 Herd of Models》预训练数据篇——论文精读笔记
  • Linux | 数据库操作基础
  • EVO-0:具有隐空间理解的视觉-语言-动作模型
  • 维基艺术图片: 构建模型 (3)
  • 应用层协议和JSON的使用
  • 文心大模型4.5开源测评:轻量化部署实践与多维度能力验证
  • 贝尔量子实验设想漏洞
  • 云服务器的基础使用
  • [Dify]-基础入门8- 使用 Dify 创建文档问答机器人(零代码实现)
  • 39.Sentinel微服务流量控制组件
  • .NET + WPF框架开发聊天、网盘、信息发布、视频播放功能
  • [Subtitle Edit] 字幕格式处理 | .Net依赖管理(NuGet)
  • opencv python 基本操作
  • 前端面试十二之vue3基础
  • redis汇总笔记
  • 日志系统 on Linux C/C++
  • UE5多人MOBA+GAS 21、给升龙添加连段攻击,从角色的按下事件中传递事件给GA
  • Action-Agnostic Point-Level Supervision for Temporal Action Detection
  • 一扇门铃,万向感应——用 eventfd 实现零延迟通信
  • QCustomPlot绘图保存成PDF文件
  • 网络安全的基本练习
  • 北京-4年功能测试2年空窗-报培训班学测开-第四十九天
  • 行测速算之假设分配法
  • ROS2中的QoS(Quality of Service)详解
  • v-show和v-if的区别
  • 算法复杂度分析:大O表示法详解