LeetCode 415. 字符串相加 和 43. 字符串相乘

这两个题目是关于string类的相关使用的练习题。同时,这也是关于大数运算的题目,让我们来分析一下吧!
在这里插入图片描述

字符串相加

难度 简单 OJ链接

在这里插入图片描述
我们以示例2来讲解这题思路:
在这里插入图片描述
首先,我们用两个下标指向两个字符串最后的位置。然后让这两个数相加6+7=13,所以这里我们要进1。
在这里插入图片描述
然后将3头插到一个新的字符串里。然后下标往前移一位。
在这里插入图片描述
5+7=12,12还要加进位上的数12+1=13,13那么还要进位,进位还是1。我们把3头插到新的字符串里,然后下标再往前移一位。
在这里插入图片描述
此时,有一个字符串结束了。但此时还不能结束,我们把剩下的位置都看作0。也就是4+0+1(进位)=5。5是小于10的不需要进位,我们就把进位改为0。然后我们把5再头插到新字符串里。
在这里插入图片描述
此时两个字符串的数都结束了,才是真正的结束。

那么,我们再看这道题的写法:
在这里插入图片描述
首先,我们要把进位设为0,因为一开始两个数相加没有进位。这里,为什么会用三目操作符呢?原因是:可能有一个字符串先结束,如果结束了,我们还去取那里的位置就会出现越界了。所以如果有一个先结束,我们就直接给0。还有这里我们减了一个字符0,如果我们没有减字符0,那么我们取的是字符数字。像’1’的ASCII值为49,而我们需要的数字就是1,所以要减去一个字符0。
在这里插入图片描述
如果相加的数大于9,那么我们就把进位设为1,没有的话就改为0。
在这里插入图片描述
然后我们再把每一个字符头插进去。此时我们也需要把字符0加上才行。

但此时还有一点问题:就是如果’9’+'1’这个字符串,按照上面的写法9+1=10,是大于9的,然后减10,ret=0,carry=1。把字符0插入字符串里,然后end1–,end2–,循环就结束。此时字符串里只有一个0,没有1。所以我们还要再判断一下。
在这里插入图片描述
但是每次的头插它的时间复杂度是O(N^2),所以时间上会很慢。我们可以这样去写:
在这里插入图片描述
我们直接尾插,当所有的数尾插完了。我们再把全部给翻转过来。这样的时间复杂度为O(N)。

字符串相乘

难度 简单 OJ链接
在这里插入图片描述
思路流程:
我们以下面的数据为例:
在这里插入图片描述
根据我们小学时学习的乘法。47=28,我们要把8留下,然后进2。但是在这里,我们先不进位。而是把28保留下来。后面37=21也不进位把它保留下来。所有的计算都不进位。
在这里插入图片描述
然后,我们把每一列的数全加起来。
在这里插入图片描述
此时,我们再从后往前,一位一位的开始进位。
在这里插入图片描述
下面就开始一步一步来实现:
第一步:如果这两个字符串当中有一个字符串为空字符串,则直接返回空字符串
在这里插入图片描述

第二步:开辟一个数组,把每次的数据累计到数组中
在这里插入图片描述
这里我们先计算了两个字符串的长度m,n。而这个数组该开多大呢?举个例子:
100 * 100=10000,两个三位数相乘,最小的是5位数。999 * 999=998001,两个三位数相乘,最大的是6位数。所以,我们就开辟m+n个空间就足以放下。因为最小是m+n-1,最大是m+n,然后我们再把里面的空间初始化0。

第三步:两个字符串的数字从后往前每一位相乘,然后累加到数组里
在这里插入图片描述
这里可能有的同学不知道为什么是i+j+1?
在这里插入图片描述
这是两个字符串的下标位置。
在这里插入图片描述
这是数组里数据的下标位置显示。我们看到4 * 7=28,28在数组下标为6的地方,此时的i为3,j为2,所以2+3+1=6。像3*7=21,在数组下标为5的地方,此时i为2,j为2,所以2+2+1=5。其它的也是一样的道理。

第四步:将数组里的数据开始每一位进位
在这里插入图片描述
第五步:将数组里的数据从头开始尾插到新字符串中
在这里插入图片描述
可能有的同学不知道这是什么意思?这是判断数组开头有没有数据。如果开头是0,说明没有进位进到开头处。我们只需从数组下标为1的地方开始尾插。如果不是0,说明有进位进到开头处,我们需要从数组下标为0的地方开始尾插。

好了,这两道题我们以讲解完毕。如果大家觉得有帮助,可以点赞收藏一下。谢谢大家!!!
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 使用reverse函数反转leetcode字符串的方法是:将字符串作为参数传入reverse函数,然后将反转后的字符串返回给调用者。例如:let reversedString = reverse("leetcode")。 ### 回答2: 要使用reverse函数反转leetcode这个字符串,可以使用以下步骤: 1. 将字符串"leetcode"转换为字符数组。可以使用字符串的toCharArray()方法,该方法会返回一个字符数组,其中每个元素是字符串的一个字符。 2. 定义两个指针,left和right,分别指向字符数组的首尾。 3. 循环交换left和right指向的字符,然后将left指针向右移动一位,将right指针向左移动一位,直到left指针大于等于right指针。 4. 将反转后的字符数组转换回字符串。可以使用字符数组的valueOf()方法,该方法会将字符数组转换为一个新的字符串。 以下是用Java代码实现上述步骤的示例: ```java public String reverseString(String s) { // 将字符串转换为字符数组 char[] chars = s.toCharArray(); // 定义两个指针 int left = 0; int right = chars.length - 1; // 循环交换字符 while (left < right) { char temp = chars[left]; chars[left] = chars[right]; chars[right] = temp; left++; right--; } // 将字符数组转换为字符串 return String.valueOf(chars); } ``` 通过调用reverseString("leetcode")函数,将会返回字符串"edocteel",即将"leetcode"反转的结果。 ### 回答3: 要使用reverse函数来反转字符串"leetcode",只需将字符串转换为一个列表,然后使用reverse函数来翻转该列表,最后将列表转回字符串即可。 首先,将字符串"leetcode"转换为一个字符列表,可以使用list函数来实现,即list("leetcode"),得到列表['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']。 接下来,使用reverse函数来反转该列表,即reverse(['l', 'e', 'e', 't', 'c', 'o', 'd', 'e'])。 最后,将翻转后的列表转换回字符串,可以使用join函数将列表中的字符连接起来,即''.join(['e', 'd', 'o', 'c', 't', 'e', 'e', 'l'])。 所以,将字符列表['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']翻转并转换为字符串的过程为:''.join(reverse(list("leetcode"))),得到的结果为"edocteel",即字符串"leetcode"反转后的结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学代码的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值