LeetCode.415-字符串相加(Swift)

243 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情 。如果哪里写的不对,请大家评论批评。

希望往后的日子,可以每天坚持一个算法

字符串相加

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

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

  • 示例 1:
输入:num1 = "11", num2 = "123"
输出:"134"
  • 示例 2:
输入:num1 = "456", num2 = "77"
输出:"533"
  • 示例 3:
输入:num1 = "0", num2 = "0"
输出:"0"

分析

因为是个字符串存储着数值,而且长度不一定是多少,那么对于数据的操作,我们不能转成Int类型。

  1. 创建两个变量(数组、标记是不是进一)
  2. 把两个字符串转成一个个字符的数组A和B
  3. 取出A和B的最后一位相加,大于10,标记设置为1,反之位置为0
  4. 相加的和机上标记位再除10取余,余数加入数组
  5. 删除数组的最后一位
  6. A或者B不存在,只能单个数组加标记位
  7. 不断的循环或者递归

代码Swift

func addStrings(_ num1: String,_ num2: String) -> String {
    let num1list = num1.map{String($0)}
    let num2list = num2.map{String($0)}
    
    var result = [String]()
    var addOne = 0
    
    var num1Last = num1list.count - 1
    var num2Last = num2list.count - 1

    while num1Last >= 0 || num2Last >= 0 {
        var rel = 0
        if num1Last >= 0 {
            rel += Int(num1list[num1Last])!
        }
        if num2Last >= 0 {
            rel += Int(num2list[num2Last])!
        }
        rel += addOne
        addOne = rel >= 10 ? 1 : 0
        result.append(String(rel % 10))
        num1Last -= 1
        num2Last -= 1
    }
    
    if addOne > 0 {
        result.append(String(1))
    }
    return result.reversed().joined()
}

第二种:

func addStrings(_ num1: String,_ num2: String) -> String {
    print(num1)
    print(num2)

    let num1list = num1.map{String($0)}
    let num2list = num2.map{String($0)}
    
    var result = [String]()
    var addOne = 0
    // 比较大的数组
    var maxList = (num1list.count > num2list.count) ?  num1list : num2list
    // 比较小的数组
    var minList = (num1list.count > num2list.count) ?  num2list : num1list

    while maxList.count > 0 {
        var rel = 0
        rel += Int(maxList.last!)!
        maxList.removeLast()
        
        if minList.count > 0 {
            rel += Int(minList.last!)!
            minList.removeLast()
        }
        
        rel += addOne
        addOne = rel >= 10 ? 1 : 0
        result.append(String(rel % 10))
    }
    
    if addOne > 0 {
        result.append(String(1))
    }
    return result.reversed().joined()
}