【C++】415.字符串相加

【leetcode】字符串相加 c++ 题目描述: 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 示例1: 输入:num1 = "11", num2 = "123" 输出:"134" 示例2: 输入:num1 = “456”, num2 = “77” 输出:“533” 示例3: 输入:num1 = “0”, num2 = “0” 输出:“0” 代码: #include<s 阅读详情

题目描述:

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

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

示例1:

输入:num1 = "11", num2 = "123"
输出:"134"

示例 2:

输入:num1 = "456", num2 = "77"
输出:"533"

示例 3:

输入:num1 = "0", num2 = "0"
输出:"0"

提示:

  • 1 <= num1.length, num2.length <= 104
  • num1 和num2 都只包含数字 0-9
  • num1 和num2 都不包含任何前导零

思路分析

我们先假设给定的不是字符串形式的数字,而是正常的非负整数,那么两数相加就遵循正常的加法运算,即个位数与个位数相加,十位数与十位数相加,依此类推。如果该位计算结果大于9,则向前进位。那么对于字符串形式的数字,我们就需要先将字符数字转换为数值数字,而在转换之前,我们首先要做到能对字符串进行遍历,遍历字符串的方式有很多,这里我们选择比较简单的下标+方括号的形式来进行访问。由于数字相加是由末尾开始,所以在这里我们也一样先拿到字符串最后一个元素的下标:

int end1 = num1.size() - 1;
int end2 = num2.size() - 1;

拿到最后一个元素的下标后,就可以开始进行运算了。而在运算前,我们需要先将字符数字转换为数值数字。除此之外,在转换前,我们还需要先判断下标是否为0,如果为0则说明该字符串已经遍历完了,直接置零即可。所以我们可以这样写:

int val1 = 0;//默认给0
if (end1 >= 0)//如果字符串还没有遍历完,则进行转换
	val1 = num1[end1] - '0';
int val2 = 0;
if (end2 >= 0)
	val2 = num2[end2] - '0';

如果觉得这个地方写得有点啰嗦,那么我们也可以用三目运算符进行修改:

int val1 = end1 >= 0 ? num1[end1] - '0' : 0;
int val2 = end2 >= 0 ? num2[end2] - '0' : 0;

得到当前字符所代表的数值后,下面我们就可以对两个值进行相加。相加的时候,需要注意的是上一位的进位也要加进来,我们可以将进位初始化为0,这样末位相加的时候虽然没有进位但也可以用同一个表达式计算:

int next = 0;//进位
int ret = val1 + val2 + next;

加完之后,我们就需要对ret进行判断,如果ret大于9,则说明需要进位,注意这里不要忘记对ret小于9的情况进行处理,因为如果ret小于9的话next就需要置零,如果这里不进行处理,那么之前的进位就会一直得到保留并继续和高位相加导致运算结果出错:

if (ret > 9)//ret大于9的话next进位
{
	ret -= 10;
	next = 1;
}
else//否则next置零
{
	next = 0;
}

实际上,这个地方我们也可以进行简化:

next = ret / 10;//超过10的值除就是1,进位
ret = ret % 10;//模10留下余数

运算结束后,我们就可以将得到的值放回一个新的字符串中作为结果。这里需要注意的是,由于我们是从末位开始计算,因此每得到一位的值应该插入在上一个值的前面:

string strret;
strret.insert(0, 1, '0' + ret);//表示在字符串strret的首位插入1个'0' + ret所表示的字符

到这里,我们一位相加的过程就算结束了,继续往下进应该是高一位相加,直到字符串遍历完毕,因此,刚才的代码我们可以放在一个循环中:

while (end1 >= 0 || end2 >= 0)//end1和end2只要有一个不为0则说明字符串还没有遍历完,继续循环
{	
	int val1 = end1 >= 1 ? num1[end1] - '0' : 0;
	int val2 = end2 >= 1 ? num2[end2] - '0' : 0;
	int ret = val1 + val2 + next;
		
	next = ret / 10;
	ret = ret % 10;
	strret.insert(0, 1, '0' + ret);
	strret += ('0' + ret);
	--end1;
	--end2;
}

当循环结束时,我们可能会觉得这个时候strret中存放的字符串代表的就是相加后的值了,但是实际上,如果刚才的循环中最高位相加还产生了进位,由于此时字符串已经遍历到最高位,循环将不再进行,所以出了循环之后我们还需要再进行一次判断,如果有进位,就需要把进位插在首字符的位置:

if (next == 1)
		strret.insert(0, 1, '1');
return strret;

完整代码

string addStrings(string num1, string num2) 
{
	int end1 = num1.size() - 1;
	int end2 = num2.size() - 1;
	int next = 0;
	string strret;
	while (end1 >= 0 || end2 >= 0)
	{
		int val1 = end1 >= 0 ? num1[end1] - '0' : 0;
		int val2 = end2 >= 0 ? num2[end2] - '0' : 0;
		int ret = val1 + val2 + next;
		
		next = ret / 10;
		ret = ret % 10;
		strret.insert(0, 1, '0' + ret);
		--end1;
		--end2;
	}
	if (next == 1)
		strret.insert(0, 1, '1');
	return strret;
}

运行结果:

在这里插入图片描述

从运行结果可以看到,当前我们的代码效率还是比较低的,那么有哪些地方可以优化呢?

后续优化

在刚才的代码中,最影响效率的其实是下面这段代码:

strret.insert(0, 1, '0' + ret);

其原因在于,每插入一个字符,都要将原来的字符向后移动一位,也就是说插入第一个值时会挪一下,插入第二个值会挪两下,依此类推,插入第n个值时会挪n下,可以看到挪动的次数会以一个等差数列的形式呈现,而由等差数列的求和公式可知这是一个n2的数量级,也就是说它的时间复杂度为n2。

而如果我们采用尾部插入的形式,每次插入就不需要对原来的数据进行移动,只需要在插入完成后将字符串倒置一下即可;除此之外,由于每次插入都需要扩容,所以为了进一步提高效率,我们可以事先把需要的空间开辟出来,而这个空间刚好就是长的字符串加1。那么根据前面的分析,尾插我们可以用+=实现,而在标准库函数中,可以实现逆置的函数为reverse,string类中有用来开辟空间的reserve,那么我们就可以对代码进行如下修改:

string addStrings(string num1, string num2)
{
	int end1 = num1.size() - 1;
	int end2 = num2.size() - 1;
	int next = 0;
	string strret;
	strret.reserve(num1.size() > num2.size() ? num1.size() + 1 : num2.size() + 1);//提前开辟空间
	while (end1 >= 0 || end2 >= 0)
	{
		int val1 = end1 >= 0 ? num1[end1] - '0' : 0;
		int val2 = end2 >= 0 ? num2[end2] - '0' : 0;
		int ret = val1 + val2 + next;

		next = ret / 10;
		ret = ret % 10;
		strret += ('0' + ret);//尾插
		--end1;
		--end2;
	}
	if (next == 1)
		strret += '1';
	reverse(strret.begin(), strret.end());//倒置
	return strret;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到,优化过后的代码运行起来效率就很高了。

Leetcode刷题详解——字符串相加 这个算法的思路是通过逐位相加的方式,将两个字符串表示的整数相加。在每次循环中,从字符串的末尾开始,依次取出每一位数字,并将其与进位值相加,得到当前位的结果。然后将结果除以10取余数,得到当前位的数字,并将其添加到结果字符串中。最后,将结果字符串反转,得到最终的相加结果。你不能使用任何內建的用于处理大整数的库(比如。), 也不能直接将输入的字符串转换为整数形式。,计算它们的和并同样以字符串形式返回。给定两个字符串形式的非负整数。 阅读详情

相关推荐

字符串相加

要将两个存放整形数字的字符串进行相加,可以按照小学学竖式的思路进行。 定义一个long_num表示num1 的字符个数 short_num表示num2 的字符个数,通过比较让long_num标记较长的字符串。 然后定义一个string类型对象用来存放结果。定义一个carry用来标记是否有进位。 从两个字符串的末尾开始拿数字进行相加,如果有进位下一轮相加时要加上进位, 每次加完后要将进位标记置为0。 循环结束时要判断是否还有进位,有要将进位的1也保存起来,没有则要将保存结果的字符串的首位删掉 class So

TONGtongTONG000的博客 1732

[C++]-字符串相加/字符串相乘

示例 3: 输入:num1 = "0", num2 = "0"给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。输出: "56088"

dio33的博客 5710

GO与KEGG富集分析实战:从差异基因到功能注释

本文详细介绍了GO与KEGG富集分析的完整实战流程,从差异基因列表出发,通过基因ID转换、核心分析到结果可视化,系统阐述了如何将基因数据转化为生物学洞察。文章重点讲解了使用R语言clusterProfiler包进行GO和KEGG富集分析的具体步骤、参数设置及常见问题解决方案,并强调了结果解读与生物学故事构建的方法,帮助研究者深入理解差异基因的集体功能倾向。

weixin_29291863的博客 918

深入String字符串相加结果与原理

String a = "a"; String b = "b"; String c1 = "ab"; String c = "a"+"b"; String c2 = "a"+"b"; 1. 分析: String a = "a"; String b = "b"; String c1 = "ab"; 1.会把字符串"a"、“b”、“ab"放进常量池中,并返回给a、b、c1 2.String c=”a“+“b” jvm会在运行时将"a”+“b"自动拼接成"ab”, 然后会首先在常量池中..

weixin_43874591的博客 1万+

【Office激活】学校正版Office已激活成功仍弹出激活窗口

学校正版Office激活问题:已激活成功仍弹出激活窗口

ESCM_的博客 1万+

万达电影 com.wandafilm.app headers check

万达电影 安卓逆向 抓包 逆向 check

weixin_43786514的博客 1436

LeetCode 415.字符串相加 C++写法

首先不能用stoi和tostring来做,如果给一个很大的数那一定存不下。我们可以,创建一个变量用于计算下一位数,之后,每一位,完成所有尾插后用就是我们要得到的结果。

m0_63816268的博客 538

亚马逊广告接口 amazon advertising

亚马逊广告接口官方说明:https://advertising.amazon.com/API/docs/en-us/setting-up/account-setup 一:注册aws开发者账号 注册地址:https://developer.amazon.com 二:填写注册资料 三:进入控制台,生成安全配置文件 进入 Login with Amazon 菜单: 创建配置文件: 四:申请广告接入权限 申请地址:https://advertising.amazon.com/zh-cn/about-api

lzy66666的博客 4775

Leetcode 415. 字符串相加 C++

Leetcode 415. 字符串相加 题目 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和num2 都不包含任何前导零。 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。 题解 模拟加法,当前位 = (num1[i]+num2[i]+cin)%10,注意更新进位。详细过程见代码 代码 string addStrings(str

weixin_43750513的博客 270

CentOS 7下Ollama+Dify+DeepSeek离线部署全攻略(附模型迁移技巧)

本文详细介绍了在CentOS 7无网环境下,从零开始离线部署Ollama、DeepSeek模型与Dify平台的完整实战攻略。内容涵盖基础环境规划、Ollama服务安装、模型文件迁移技巧、Docker引擎离线部署,以及Dify平台与本地Ollama服务的集成配置,为企业内网构建安全、可控的AI应用提供了一套经过验证的解决方案。

weixin_28826521的博客 348

XGBoost原生接口和Sklearn接口参数详解

XGBoost原生接口和Sklearn接口参数详解

算法工程师 2653

【C++_string】leetcode 415.字符串相加 _详解

你可能会想两个数字位数不同怎么处理,这里我们统一在指针当前下标处于负数的时候返回 0,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理,具体可以看下面的代码。本题我们只需要对两个大整数模拟「竖式加法」的过程。竖式加法就是我们平常学习生活中常用的对两个整数相加的方法,回想一下我们在纸上对两个整数相加的操作,是不是如下图将相同数位对齐,从低到高逐位相加,如果当前位和超过 10,则向高位进一位?因此我们只要将这个过程用代码写出来即可。

m0_46676283的博客 837

SAP S/4 HANA CO 成本模块实战指南

摘要:SAP S/4HANA CO(管理会计)模块是企业内部成本管理的核心工具。本文系统介绍了CO模块的组织结构(控制范围与会计科目表映射)、基础概念(计划值与预算值)以及6大子模块功能(成本要素、成本中心会计等)。重点解析了各子模块的应用场景与差异,包括成本归集、费用分摊、利润分析和产品成本控制,并对比了利润中心与成本中心、内部订单与销售订单的区别。通过事务代码示例和功能对比表,帮助用户快速掌握SAP CO模块的核心管理逻辑与实施要点。

金牌架构师 1125

C/C++描述 LeetCode 415. 字符串相加

415. 字符串相加   大家好,我叫亓官劼(qí guān jié ),在优快云中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在优快云中写博客,唯一博客更新的地址为:亓官劼的博客 本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!! 难度简单214收藏分享切换为英文关注反馈 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和n

一起加油 1617

解决Qt字体问题:QFontDatabase: Cannot find font directory xx/lib/fonts

1.直接在main函数里设置app的整体字体库.这个错误提示比较明显的就是字体库缺失。

有问题或资源连接有缺失的可以私信公众号新潮看世界获取 3041

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

字符串相加leetcode415—C++

【代码】字符串相加leetcode415—C++

2303_76260560的博客 417

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【C++力扣】917.仅仅反转字母|387.字符串中第一个唯一字符|415.字符串相加

本文写的是力扣三道题的解答:917、387、415题,都是与string字符串有关的!

白乐天_ξ( ✿>◡❛)的博客 992

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

415. 字符串相加【大数相加的问题】(C++实现)

1.题目 2.思路 其实我们这种字符串的大数相加,不可以直接使用stoi,或者stoll这种函数去相加,因为随时有可能越界的; 我们其实需要的是模拟我们计算加法的过程就行; 1.定义两个尾指针,指向num1,nums2的最后一个数字,让这两个数字相加,并把相加的结果记录下来;但是我们还需要考虑多一个问题,就是num1和nums2的长度问题,假如哪个比较短的,我们就用0给它不上去就可以;至于如何判断短的,只要有尾指针越界了,另一个没有越界,那么越界的就表示该字符串比较短; 2.假如相加产生进位就处理它,只

呋喃吖的博客 1678

字符串相加(大数相加)-模拟415-C++

class Solution { public: string addStrings(string num1, string num2) { int i = num1.length() - 1; int j = num2.length() - 1; int carry = 0; string res; while(i >= 0 || j >= 0 || carry != 0){ int

VaccyZhu的博客 223

【无标题】leeched 415 字符串相加c++

链接:https://leetcode.cn/problems/add-strings/solutions/357938/zi-fu-chuan-xiang-jia-by-leetcode-solution/商业转载请联系作者获得授权,非商业转载请注明出处。来源:力扣(LeetCode)

weixin_45495051的博客 440

【C++】力扣-415-字符串相加(双指针,图例详解!!!)

最近春招已经开始,看周围的同学都在投递一些大厂的实习,某为的手撕代码 --- 字符串相乘,某讯的手撕代码 --- 字符串相减等。 于是专门去 Leetcode 上搜索了一下,发现这类题目是面试常考的题目。只要我们熟练的 掌握四则运算,熟练的掌握字符串的处理,就可以迎刃而解啦! 常考算法面试题分为:字符串(大数)相加、字符串(大数)相乘、字符串(大数)相减。本次博客主要通过图例和双指针来讲解 ---- 字符串(大数)相加

weixin_45031801的博客 1292

C/C++编程题刷题:leetcode415. 字符串相加

415. 字符串相加 难度简单252 给定两个字符串形式的非负整数num1和num2,计算它们的和。 提示: num1和num2的长度都小于 5100 num1和num2都只包含数字0-9 num1和num2都不包含任何前导零 你不能使用任何內建 BigInteger 库,也不能直接将输入的字符串转换为整数形式 class Solution { public: string addStrings(string num1, string num2) { ...

Emotion的博客 366

【LeetCode】C++ :简单题 - 字符串 415. 字符串相加

415. 字符串相加 难度简单302 给定两个字符串形式的非负整数num1和num2,计算它们的和。 提示: num1和num2的长度都小于 5100 num1和num2都只包含数字0-9 num1和num2都不包含任何前导零 你不能使用任何內建 BigInteger 库,也不能直接将输入的字符串转换为整数形式 这个和两数相加是一样道理的,在链表里面也出现过相同的题目。 模拟列竖式计算的过程,主要是一开始以n1 = 0, n2 = 0这样,然后对非空位数字将...

weixin_44566432的博客 310

LeetCode415 字符串相加 简单

LeetCode415 字符串相加 简单题目思路C++代码官方解法模拟代码感想 题目 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和num2 都不包含任何前导零。 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。 思路 因为是字符串表示的数字,且根据题目描述,不存在前导0和其他字符,因此这一题应当是把字符串当作数字来相加的。 因

SlipperSoar的博客 266

C++ | Leetcode C++题解之第415题字符串相加

C++ | Leetcode C++题解之第415题字符串相加

Ddddddd_158的博客 526

精选力扣500题 第26题 LeetCode 415. 字符串相加【c++ / java 详细题解】

目录1、题目2、思路3、c++版代码4、java版代码5、高精度java模板整理 1、题目 给定两个字符串形式的非负整数num1和num2,计算它们的和。 提示: num1 和num2 的长度都小于 5100 num1 和num2 都只包含数字0-9 num1 和num2 都不包含任何前导零 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式 2、思路 (高精度模板题) 1、若t1表示第一个数当前位数的大小,t2表示第二个数当前位数的大小,next表示进位数

林深不见鹿 的博客 4373
上一篇: 二十二、通讯录实现
下一篇: 一、C++入门
Kutbas
博客等级 码龄7年 737粉丝 55原创
评论 43
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Kutbas

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

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

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

打赏作者

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

抵扣说明:

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

余额充值