LeetCode43-字符串相乘

本文详细解析了如何在不使用标准库大数类型或直接转换为整数的情况下,实现两个以字符串形式表示的非负整数的乘法运算。通过ASCII码转换,巧妙地将字符串与整数类型联系起来,提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,要吐槽的是

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

说的是我发布谩骂消息

我也是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%左右。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学习的学习者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值