携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情 。如果哪里写的不对,请大家评论批评。
希望往后的日子,可以每天坚持一个算法
字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
- 示例 1:
输入:num1 = "11", num2 = "123"
输出:"134"
- 示例 2:
输入:num1 = "456", num2 = "77"
输出:"533"
- 示例 3:
输入:num1 = "0", num2 = "0"
输出:"0"
分析
因为是个字符串存储着数值,而且长度不一定是多少,那么对于数据的操作,我们不能转成Int类型。
- 创建两个变量(数组、标记是不是进一)
- 把两个字符串转成一个个字符的数组A和B
- 取出A和B的最后一位相加,大于10,标记设置为1,反之位置为0
- 相加的和机上标记位再除10取余,余数加入数组
- 删除数组的最后一位
- A或者B不存在,只能单个数组加标记位
- 不断的循环或者递归
代码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()
}