【Swift】LeetCode 1. 两数之和
1. 两数之和
刚开始学习 Swift 的语法,纯看文档过于枯燥,因此在这个专栏记录使用 Swift 刷题的一些题解,在实操中掌握 Swift 的语法。第一题我们从最经典的「两数之和」开始,基于这道题目可以熟悉 Swift 当中 Dictionary 的声明、实例化与使用。

题目描述
思路与 Swift 题解
思路其实很简单,我们使用一次遍历的方式来解题。
首先,我们声明一个 Swift 的 Dictionary
,声明的方式有两种:
// 1. 使用 () 生成
var mp = [Int: Int]()// 2. 使用 ":" 指定变量的类型, 然后声明一个空的 Dictionary
var mp: [Int: Int] = [:]
在遍历时,我们需要记录当前数值num
出现在数组当中的下标,每次记录之前,我们需要先判断target - num
是否已经出现在了数组当中,如果出现过了,那么mp
当中会记录它出现的位置,num + (target - num) == target
,因此直接返回当前位置i
和mp[target - num]
记录的下标位置j
即可。
for (i, num) in nums.enumerated() {if var j = mp[target - num], i != j {return [i, j]}mp[num] = i
}
需要注意的一点是,在 Swift 当中,使用if let j = mp[target - num]
这样的表达式可以在if
条件句当中取出字典当中的数值,这叫做 Swift 的“可选绑定”,它的作用是判断可选类型(mp[target - num]
就是一个可选类型,严格意义上来说它的类型是Int?
,也就是Int
数值或nil
,原因是Dictionary
当中可能还没有记录这个Key)的值是否存在,如果存在,那么会对可选类型进行自动解包(将Int?
解包为Int
);如果不存在,则不会进入这个语句块。
同时,与 Go 不同的是,如果j
自动解包成功,那么在if
当中后续的判断条件使用,
进行连接,而不是&&
,这一点有一些反直觉。需要注意的是,只有在if
当中使用“可选绑定”时,可选绑定语句需要与其它条件使用,
连接,例如:
if let name = user.name, let email = user.email, !name.isEmpty && email.contains("@") {sendEmail(to: email)
}
完整的 Swift 题解是:
class Solution {func twoSum(_ nums: [Int], _ target: Int) -> [Int] {var mp = [Int: Int]()for (i, num) in nums.enumerated() {if var j = mp[target - num], i != j {return [i, j]}mp[num] = i}return []}
}
需要注意的一点是,LeetCode 给出的函数模版当中,在参数nums
和target
之间都加入了_
,它们的作用是告知函数使用者在调用时,可以不显式标注形参的名称,而是按照形参声明的顺序调用函数,否则在调用时,需要:twoSum(nums: curr_nums, targert: curr_target)
。