2024/4/5—力扣—字符串相乘

代码实现:

方法一:常规解法——超出整数表示范围

long long char_to_num(char *str) {
    long long num = 0;
    for (int i = 0; i < strlen(str); i++) {
        num = num * 10 + (str[i] - '0');
    }
    return num;
}

char* multiply(char *num1, char *num2) {
    long long a = char_to_num(num1), b = char_to_num(num2);
    long long c = a * b;
    if (c == 0) {
        return "0";
    }
    char *res = malloc(sizeof(char) * strlen(num1) + strlen(num2) + 3);
    int n = 0;
    while (c) {
        res[n++] = c % 10 + '0';
        c /= 10;
    }
    for (int i = 0; i < n / 2; i++) {
        int t = res[i];
        res[i] = res[n - 1 - i];
        res[n - 1 - i] = t;
    }
    res[n] = 0;
    return res;
}

方法二:(字符串模拟) O(n∗m)

1. 普通竖式

以num1 = 123 , num2 = 456为例:我们遍历 num2 每一位与 num1 进行相乘,将每一步的结果进行累加,在这个过程如果相乘或者相加的结果大于等于10 ,我们都要去满10进位

char *multiply(char *num1, char *num2) {
    int len1 = strlen(num1), len2 = strlen(num2);
    char *ans = (char*)malloc((len1 + len2 + 1) * sizeof(char));
    memset(ans, '0', sizeof(char) * (len1 + len2));
    ans[len1 + len2] = '\0';
    int c = 0;
    for (int i = len2 - 1; i >= 0; i--) {
        int b = num2[i] - '0';
        for (int j = len1 - 1; j >= 0; j--) {
            int a = num1[j] - '0';
            int d = ans[i + j + 1] - '0';
            int x = a * b + d + c;
            ans[i + j + 1] = x % 10 + '0';
            c = x / 10;
        }
        if (c) {
            ans[i] = c + '0';
            c = 0;
        }
    }
    // 去除前缀0
    int k = 0;
    while (ans[k] == '0' && k <= len1 + len2) {
        k++;
    }  
    if (k == len1 + len2) {
        return "0";
    } else {
        ans += k;
    }
    return ans;
}

2. 优化竖式

其实在相乘或者相加计算过程的每一位,可以考虑先不去满10进位,等到计算完所有的相乘结果以后,最终将其加到一块,再去满10进位 ,最后的结果和普通竖式 一样,但却可以大大简化我们的模拟过程

具体过程如下:

  1. 长度是n和长度是m的数字相乘,最多只有n + m位,为了方便计算,将num1和num2反向存储到A[]和B[]中,即位数低的在数组前面,且开一个大小是n + m的C[]存储计算后的答案
  2. 两个数相乘时,将A[i] * B[j]的结果累加到C[i + j]中,最后C[i + j]表示i + j这个位数的值是C[i + j](如上图所示)
  3. 由于C[]数组中的某些位数字可能是大于等于10的,我们从0枚举到n + m - 1,进行满10进位, 将所有位的值全部变成个位数
  4. 最后将C[]数组反转输出

细节:

最终得到的数组C[]的高位可能包含前导0,因此在反转之前要先去除高位前导0


时间复杂度分析: O(n∗m),n和m分别是num1和num2的长度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/531075.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

拥抱智能,IT运维将有哪些变化?

Gartner数据显示&#xff0c;2023年AIOps在中国市场渗透率只达到目标受众的5%-20%。这一数据意味着仍有大量企业还未进行AIOps建设&#xff0c;未来AIOps市场前景广阔。目前&#xff0c;已经开始应用AIOps的企业&#xff0c;智能运维水平普遍还处于辅助智能化运维阶段&#xff…

linux-docker安装nginx

1.拉取镜像&#xff1a; docker pull nginx2.创建挂在路径&#xff1a; mkdir -p /usr/local/nginx/conf mkdir -p /usr/local/nginx/logs mkdir -p /usr/local/nginx/www mkdir -p /usr/local/nginx/conf.d 3.启动镜像:为了拿到位置文件&#xff0c;先启动下 docker run -…

Linux_应用篇(03) 文件 I/O 加强

经过上一章内容的学习&#xff0c;相信各位读者对 Linux 系统应用编程中的基础文件 I/O 操作有了一定的认识和理解了&#xff0c;能够独立完成一些简单地文件 I/O 编程问题&#xff0c; 如果你的工作中仅仅只是涉及到一些简单文件读写操作相关的问题&#xff0c;其实上一章的知…

spring框架构成

spring框架构成 模块 spring中集成了多个模块&#xff0c;包含有核心容器、数据访问、web、AOP等模块 核心容器包含有Spring Core、Spring Beans、Spring Context和EL模块 Spring Core spring的核心&#xff0c;提供Spring框架的基本功能。主要组件是BeanFactory&#xff0c;工…

实战攻防 | 记一次项目上的任意文件下载

1、开局 开局一个弱口令&#xff0c;正常来讲我们一般是弱口令或者sql&#xff0c;或者未授权 那么这次运气比较好&#xff0c;直接弱口令进去了 直接访问看看有没有功能点&#xff0c;正常做测试我们一定要先找功能点 发现一个文件上传点&#xff0c;不过老规矩&#xff0c;还…

实用运维工具(转载)

1、查看进程占用带宽情况-Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。 下载&#xff1a;http://sourceforge.net/projects/nethogs/files/nethogs/0.8/nethogs-0.8.0.tar.gz/download [rootlocalhost ~]#yum -y install libpcap-deve…

Jenkins 命令无法后台运行,使用BUILD_ID=dontKillMe解决

例子&#xff1a; jenkins如果在shell里使用nohup发现还是不能后台运行&#xff0c;直接挂掉。 那么可以在jenkins命令里加上BUILD_IDdontKillMe解决 nohup python main.py >server.out 2>&1 &它的作用是在后台运行名为main.py的Python脚本&#xff0c;并将标准…

使用自己的数据基于SWIFT微调Qwen-Audio-Chat模型

目录 使用自己的数据训练参数设置自己的数据准备语音转写任务语音分类任务 开始训练不同训练方法mpddpmp ddpdeepspeed 训练实例训练详情Qwen-Audio-Chat模型 模型数据实例官方可用的数据由内部函数处理为指定格式 训练好的模型测试 使用自己的数据 官方参考文档&#xff1a;…

昇腾Ascend之npu-smi工具在Atlas 200I DK A2的简单使用

一、参考资料 npu-smi工具 二、测试环境 设备型号&#xff1a;Atlas 200 DK(Model: 3000) Operating System Version: Ubuntu 22.04 LTS CPU Type: 4核TAISHANV200M处理器 AI CPU number: 1 control CPU number: 3 RAM: 4GB miscroSD: 128GBrootdavinci-mini:~# npu-smi i…

OpenSSH 安全漏洞(CVE-2023-51385) 升级v9.7

漏洞编号&#xff1a;OpenSSH 安全漏洞(CVE-2023-51385) openssh9.7文件获取 https://f.ws59.cn/f/dtv9atef3io 复制链接到浏览器打开 处理方式 ##注释掉的根据实际情况处理 #查询原openssh9.4p1是否有安装openssh-askpass&#xff0c;若有需先删除 rpm -qa | grep openss…

Chemical Science 山东师范大学唐波课题组关于核靶向探针的综述

文献来源&#xff1a;Fluorescent probes for organelle-targeted bioactive species imaging - Chemical Science (RSC Publishing) 一、 基于RONSS的探针设计&#xff1a; 1.基于ROS的探针设计&#xff1a; ROS&#xff08;包括, , , , , &#xff09;可以扩散到细胞核内&am…

Redis 常用的基本命令

&#x1f525;博客主页&#xff1a;fly in the sky - CSDN博客 &#x1f680;欢迎各位&#xff1a;点赞&#x1f44d;收藏⭐️留言✍️&#x1f680; &#x1f386;慢品人间烟火色,闲观万事岁月长&#x1f386; &#x1f4d6;希望我写的博客对你有所帮助,如有不足,请指正&#…

MUNK电源维修GmbH高频电源E230 G60/45 WRG-TFMYCT24

德国MUNK电源维修主要系列&#xff1a;ΡKA2&#xff0c;DCAC100&#xff0c;AS100&#xff0c;HS100&#xff0c;ESA2000&#xff0c; HSG2000&#xff0c;E230 G60/45&#xff1b;E230 G100&#xff0c;D400 G100全系列型号。 常见维修型号包括&#xff1a;D400 G100/75WRG-…

wsl下Linux使用chatglm.cpp记录

前言 Linux之前用的少&#xff0c;多数还是在Windows下操作&#xff0c;导致对Linux很陌生&#xff0c;而且思维定势的&#xff0c;一有什么操作&#xff0c;还是习惯性在Windows下操作。 在chatglm.cpp操作上也是如此&#xff0c;但是代码可不管你这些&#xff0c;该报错就报…

【面试题】微博、百度等大厂的排行榜如何实现?

背景 现如今每个互联网平台都会提供一个排行版的功能&#xff0c;供人们预览最新最有热度的一些消息&#xff0c;比如百度&#xff1a; 再比如微博&#xff1a; 我们要知道&#xff0c;这些互联网平台每天产生的数据是非常大&#xff0c;如果我们使用MySQL的话&#xff0c;db实…

Git 解决分支冲突

一、前言 一直习惯于 add commit push 的三步走&#xff0c;偶然间看到了一个评论说在 push 之前还有一个 pull&#xff0c;小小的疑问就埋在了我的心里。于是我就先了解了 pull 的工作原理&#xff0c;就是先拉取代码&#xff08;fetch&#xff09;再合并分支&#xff08;mer…

【Qt 学习笔记】QWidget的enable属性 | API的介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ QWidget的enable属性 文章编号&#xff1a;Qt 学习笔记 / 15 文章目录…

【IC前端虚拟项目】验证环境方案思路和文档组织

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 对于mvu的验证环境,从功能角度就可以分析出需要搭建哪些部分,再看一下mvu的周围环境哈: 很明显验证环境必然要包括几个部分: 1.模拟idu发送指令; 2.模拟ram/ddr读写数据; 3.rm模拟mvu的行为; …

小白学Java成长日记特别篇

晚上好&#xff0c;各位小伙伴。今天给大家带来的是Java的输出补充篇&#xff0c;前两篇说了输出和输入的大概&#xff0c;但我没有详细讲它俩&#xff0c;因此这篇文章来详细的聊一聊它俩。那么废话不多说&#xff0c;我们赶紧进入正题。 首先讲一讲这个Java的输出吧。 输出格…

IP协议中的四大支柱:DHCP、NAT、ICMP和IGMP的功能剖析

DHCP动态获取 IP 地址 我们的电脑通常都是通过 DHCP 动态获取 IP 地址&#xff0c;大大省去了配 IP 信息繁琐的过程。 客户端首先发起 DHCP 发现报文&#xff08;DHCP DISCOVER&#xff09; 的 IP 数据报&#xff0c;由于客户端没有 IP 地址&#xff0c;也不知道 DHCP 服务器的…