经典算法题-大数相加&数字字符串相加

简介: leetcode:415. 字符串相加题链这是一个校招面试时候,手写频率比较高的一个算法题,这里给大家分享三种方法:一个常规解法,两个清奇的思路

题目描述


给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。



要求:

  • num1 和num2 的长度都小于 5100
  • num1 和num2 都只包含数字 0-9
  • num1 和num2 都不包含任何前导零
  • 你不能使用任何內建 BigInteger 库,也不能直接将输入的字符串转换为整数形式


1. 朴素做法


按竖式计算的方式,模拟向加


过程描述


  1. 从最低位开始遍历,对应位相加,再加上进位
  2. 相加结果再除10,结果为进位,余数作为当前位的值
  3. 重复上述操作,知道两个字符串都遍历完成


例:1255 + 456


初始化  进位 t = 0
0:  x + y + t      /10  商(t)  余(p)
1:  5 + 6 + 0 = 11 /10   1      1   
2:  5 + 5 + 1 = 11 /10   1      1   
3:  2 + 4 + 1 = 7  /10   0      7   
4:  1 + 0 + 0 = 1  /10   0      1   
结果:1711


实现代码


// 48 是字符 0 的ASCII码
/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var addStrings = function (num1, num2) {
    let res = ''
    let i = num1.length - 1, j = num2.length - 1, flag = 0
    while (i >= 0 || j >= 0 || flag !== 0) {
        if (i >= 0) flag += num1.charCodeAt(i--) - 48
        if (j >= 0) flag += num2.charCodeAt(j--) - 48
        res = '' + flag % 10 + res
        flag /= 10
        // 向下取整
        flag = ~~flag
    }
    return res
};


下面介绍一些其它类似的,清奇的思路


解法2


过程描述


  1. 先通过补0使两个字符串长度一样
  2. 从低位开始,对应位进行相加再加进位
  3. 结果大于等于10则 进位为1 当前位值为 结果对10求余
  4. 结果小于10 进位为0 当前位值为 结果对10求余
  5. 重复上述操作,知道两者都遍历完


实现代码


/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var addStrings = function (num1, num2) {
    let res = '' // 结果
    let flag = 0 // 进位
    // 补全0
    while (num1.length < num2.length) {
        num1 = '0' + num1
    }
    while (num2.length < num1.length) {
        num2 = '0' + num2
    }
    let i = num1.length - 1
    // 从尾数开始遍历
    while (i >= 0) {
        flag = Number(num1[i]) + Number(num2[i]) + flag
        res = (flag % 10) + res
        flag = flag >= 10 ? 1 : 0
        i--
    }
    return flag === 1 ? '1' + res : res
};


解法3


思路描述


  1. 先通过补0使两个字符串长度一样
  2. 取得当前环境所能表达最大的数字的长度l,取n= l-1 作为所能相加的最大的两个数
  3. 每一次截取后n位字符串,强转为数字,然后进行相加,再加进位
  4. 结果截取后n位作为这n位的值
  1. 如果结果长度大于n位,则进位为1,否则为0
  2. 如果结果长度小于n位,则不足位数用0进行补

实现代码


/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var addStrings = function (num1, num2) {
    let res = '' // 结果
    let flag = 0 // 进位
    const n = String(Number.MAX_SAFE_INTEGER).length - 1 // 所能表示的最大位数 -1
    // 补全0
    while (num1.length < num2.length) {
        num1 = '0' + num1
    }
    while (num2.length < num1.length) {
        num2 = '0' + num2
    }
    while (num1.length) {
        let sum = String(Number(num1.slice(-n)) + Number(num2.slice(-n)) + flag)
        flag = sum.length > n ? 1 : 0
        res = sum.slice(-n) + res
        num1 = num1.slice(0, -n)
        num2 = num2.slice(0, -n)
        // 补0
        if (num1.length && sum.length < n) {
            res = new Array(n - sum.length).fill(0).join('') + res
        }
    }
    return res
};


相关文章
|
5月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
3月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
108 1
两个字符串匹配出最长公共子序列算法
|
5月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
6月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
327 1
|
6月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
143 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
5月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
95 0
|
7月前
|
存储 算法 Cloud Native
C++ bcrypt算法 字符串加密,亲测有效
C++ bcrypt算法 字符串加密,亲测有效
|
7月前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
6月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
8月前
|
算法
KPM算法求字符串的最小周期证明
公式 `ans = n - LPS[n-1]` 描述了最小周期,其中 `n` 是子串长度,`LPS[n-1]` 是前缀函数值。证明分为特殊情况和一般情况:对于完整周期字符串,`LPS[n-1] = 3*T`,故 `ans = T`;对于非完整周期,通过分析不同长度的 `[末部分]` 和 `[前部分]`,展示 `ans` 始终等于周期 `T` 或由 `[e][b]` 构成的最小周期,从而证明公式正确。

热门文章

最新文章