【Swift】LeetCode 1. 两数之和

1. 两数之和

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

!在这里插入图片描述(https://i-blog.csdnimg.cn/direct/60e75f2be9094347964523c566491301.png# pic_center)

题目描述

思路与 Swift 题解

思路其实很简单,我们使用一次遍历的方式来解题。

首先,我们声明一个 Swift 的 Dictionary,声明的方式有两种:

swift 复制代码
// 1. 使用 () 生成
var mp = [Int: Int]()

// 2. 使用 ":" 指定变量的类型, 然后声明一个空的 Dictionary
var mp: [Int: Int] = [:]

在遍历时,我们需要记录当前数值num出现在数组当中的下标,每次记录之前,我们需要先判断target - num是否已经出现在了数组当中,如果出现过了,那么mp当中会记录它出现的位置,num + (target - num) == target,因此直接返回当前位置i和mp[target - num]记录的下标位置j即可。

swift 复制代码
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当中使用"可选绑定"时,可选绑定语句需要与其它条件使用,连接,例如:

swift 复制代码
if let name = user.name, 
   let email = user.email, 
   !name.isEmpty && email.contains("@") {
    sendEmail(to: email)
}

完整的 Swift 题解是:

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)。

相关推荐
songgeb3 天前
YYImage Bug:一行之差,正常 JPEG 如何在 iOS 被读成条纹
ios·swift
fthux4 天前
Tick Rest,一个休息提醒工具的自我修养
macos·开源·swift
Fatbobman(东坡肘子)4 天前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
chaoahyl4 天前
WaterDiary 喝水记录 App 实战(2)· 实现喝水首页与本地保存
swift
茶底世界之下6 天前
iPhone Duo 适配实战,Awaking 踩过的 8 个坑
ios·swiftui·swift
xbzb6 天前
Swift 对象存储建环实验 + Ceilometer 计量:两个收尾服务
swift·ring·实验·ceilometer·象存储·建环
2501_916008896 天前
iOS App 图标、启动屏和多语言搭配 方法,上架前使用KXBuild一次做好 App 图标
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_915918416 天前
iOS 推送通知怎么实现,从 APNs p8 密钥到 iOS 真机收到第一条推送
vscode·ios·objective-c·个人开发·swift·敏捷流程
东坡肘子6 天前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
人工智能·swiftui·swift
2501_916007478 天前
Windows OpenSSL 生成 iOS 证书,制作 p12 与描述文件,KXBuild 签名实操
windows·vscode·ios·objective-c·个人开发·swift·敏捷流程