LeetCode43-字符串相乘

首先,要吐槽的是

昨天我的知乎账号被禁了一天

说的是我发布谩骂消息

我也是fuc...了

估计是回复那些詹黑时被举报了

还是要心平静和

跟那些朋友(微笑正脸)讲道理也是没用

省的浪费我口舌了

这两天看了无双这部电影

说实话,还是不错的

虽然中间有些情节有点牵强

但最后那反转还是挺让人惊奇的

推荐推荐


43-字符串相乘

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

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

说明:

  1. num1 和 num2 的长度小于110。
  2. num1 和 num2 只包含数字 0-9。
  3. num1 和 num2 均不以零开头,除非是数字 0 本身。
  4. 不能使用任何标准库的大数类型(比如 BigInteger)直接将输入转换为整数来处理

思路:

这一题刚开始看的时候感觉无从下手,因为题目要求4是说:不能使用任何标准库的大数类型(比如 BigInteger)直接将输入转换为整数来处理,通俗地讲,就是不能直接将字符串类型转换为整数类型,int()和str()函数都不能用了,这就很蛋疼了。因为题目是要求求两数之积的,我们都知道字符串是不能直接参加四则基本运算的,所以首先肯定得是将两个字符串转化为相应的整数,再将这两个整数相乘得到结果。现在是第一关都过不了,怎么办呢?有什么办法能让整数类型和字符串类型产生联系呢?别急,让我灵光一闪(啊哈哈哈哈哈,其实是我看到网上的提示的)秘诀就是:整数与字符串之间可以通过ASCII码转换。我这么一说是不是感觉到茅塞顿开了?嘿嘿嘿嘿嘿(不知羞耻的嘚瑟一下)这个关键步骤解决了,剩下的就好办了。

代码如下:

class Solution:
    # 此题不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
    # 所以我用的方法是把字符转ASCII码方法运算,比如:"1"的ASCII码是49  ASCII码转换为int:ord('A')
    # int转为ASCII码:chr(65)
    # TypeError: 'int' object is not iterable
    def multiply(self, num1, num2):
        """
        :type num1: str
        :type num2: str
        :return: str
        """
        # 首先分别得到两个字符串的每个字符,并用列表保存
        num1_str_list = list(num1)
        num2_str_list = list(num2)
        # 这一步是本题的考点了,将每个字符转化成相应的ASCII码,ASCII码是整数类型
        num1_int_list = [ord(index)-48 for index in num1_str_list]
        num2_int_list = [ord(index)-48 for index in num2_str_list]
        # 得到了这两个字符串对应每个位置上字符的ASCII码后,现在就可以将每个字符串所对应的整数表示出来了
        num1_sum = 0
        num2_sum = 0
        for num1_index in range(len(num1_int_list)):
            num1_sum += num1_int_list[num1_index] * 10**(len(num1_int_list) - num1_index - 1)
        for num2_index in range(len(num2_int_list)):
            num2_sum += num2_int_list[num2_index] * 10**(len(num2_int_list) - num2_index - 1)
        # 接下来直接将两个字符串对应的整数相乘得到结果
        final_result = num1_sum * num2_sum

        # 接下来就是要把得到的整数类型的结果转化为str字符串类型了
        # 第一步是要得到final_result每一位的数,并保存起来
        answer_int_list = []
        if final_result > 0:
            while final_result > 0:
                indice = final_result % 10
                answer_int_list.append(indice)
                final_result = final_result // 10
            # 因为我们是从个位数开始存放数组的,所以得将这个answer_int_list逆序排列得到原始数据的正常排列
            answer_int_list.reverse()
        else:
            answer_int_list.append(final_result)
        # 第二步就是要将每一个整数转化成相应的ASCII码
        answer_str_list = [chr(index+48) for index in answer_int_list]
        return ''.join(answer_str_list)


if __name__ == "__main__":
    num1 = "123"
    num2 = "456"
    result = Solution().multiply(num1, num2)
    print(result)

执行效率一般,在50%左右。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答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"反转后的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学习的学习者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值