每日一题:累加数

力扣每日一题:累加数
一个累加序列,当它的第一个数字和第二个数字以及总长度确定后,这整个累加序列也就确定了。根据这个性质,我们可以穷举累加序列的第一个数字和第二个数字的所有可能性,对每个可能性,进行一次合法性的判断。当出现一次合法的累加序列后,即可返回 \texttt{true}true。当所有可能性都遍历完仍无法找到一个合法的累加序列时,返回 \texttt{false}false。

记字符串 \textit{num}num 的长度为 nn,序列最新确定的两个数中,位于前面的数字为 \textit{first}first,\textit{first}first 的最高位在 \textit{num}num 中的下标为 \textit{firstStart}firstStart,\textit{first}first 的最低位在 \textit{num}num 中的下标为 \textit{firstEnd}firstEnd。记序列最新确定的两个数中,位于后面的数字为 \textit{second}second,\textit{second}second 的最高位在 \textit{num}num 中的下标为 \textit{secondStart}secondStart,\textit{second}second 的最低位在 \textit{num}num 中的下标为 \textit{secondEnd}secondEnd。在穷举第一个数字和第二个数字的过程中,容易得到以下两个结论:\textit{firstStart} = 0firstStart=0,\textit{firstEnd} + 1 = \textit{secondStart}firstEnd+1=secondStart。因此,我们只需要用两个循环来遍历 \textit{secondStart}secondStart 和 \textit{secondEnd}secondEnd 所有可能性的组合即可。

在判断累加序列的合法性时,用字符串的加法来算出 \textit{first}first 与 \textit{second}second 之和 \textit{third}third。将 \textit{third}third 与 \textit{num}num 接下来紧邻的相同长度的字符串进行比较。当 \textit{third}third 过长或者与接下来的字符串不相同时,则说明这不是一个合法的累加序列。当相同时,则我们为这个序列新确定了一个数字。如果 \textit{third}third 刚好抵达 \textit{num}num 的末尾时,则说明这是一个合法的序列。当 \textit{num}num 还有多余的字符时,则需要更新 \textit{firstStart}firstStart,\textit{firstEnd}firstEnd,\textit{secondStart}secondStart,\textit{secondEnd}secondEnd, 继续进行合法性的判断。

当输入规模较小时,这题可以直接使用整形或者长整型的数字的相加。而我们这里使用了字符串的加法,因此也能处理溢出的过大的整数输入。

仍需要注意的是,当某个数字长度大于等于 22 时,这个数字不能以 00 开头,这部分的判断可以在两层循环体的开头完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值