今日题目有:
- 字符串相乘
- 三数之和
1. 字符串相乘
题目描述
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例:
输入: num1 = "2", num2 = "3"
输出: "6"
思路
模拟竖式乘法的计算法则,先将字符串反转并转成数字数组,然后逐位相乘,再相加。
Swift实现
func multiply(_ num1: String, _ num2: String) -> String {
guard num1 != "0" && num2 != "0" else {return "0"}
let n = num1.count, m = num2.count
var result = Array(repeating: 0, count: n + m)
let num1Chars = Array(num1.reversed()).map { Int(String($0))! }
let num2Chars = Array(num2.reversed()).map { Int(String($0))! }
for i in 0..<n {
for j in 0..<m {
let product = num1Chars[i] * num2Chars[j]
let sum = product + result[i + j]
result[i + j] = sum % 10
result[i + j + 1] += sum / 10
}
}
while result.count > 1 && result.last == 0 {
result.removeLast()
}
return result.reversed().map { String($0) }.joined()
}
2. 三数之和
题目描述
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
思路
看到一个小tip:输出顺序和三元组顺序不重要。那么我们可以先将数组进行排序。 然后遍历,利用双指针进行搜索,对于当前遍历位置i来说,剩余两个元素的查找在[i+1, n-1]这个索引区间里面去找。根据当前得到的和的情况去前后移动指针即可。 需要注意的是,在每重循环中,都需要剔除一些重复元素来保证唯一性。
Swift实现
func threeSum(_ nums: [Int]) -> [[Int]] {
guard nums.count >= 3 else {return []}
let nums = nums.sorted(), n = nums.count
var result: [[Int]] = []
for i in 0..<nums.count {
if i > 0 && nums[i] == nums[i-1] {
continue
}
var left = i + 1, right = n - 1
while left < right {
if left > i + 1 && nums[left] == nums[left + 1] {
left += 1
continue
}
let sum = nums[i] + nums[left] + nums[right]
if sum > 0 {
right -= 1
} else if sum < 0 {
left += 1
} else {
result.append([nums[i], nums[left], nums[right]])
left += 1
}
}
}
return result
}
...