文章目录
摘要
在这篇文章中,我们将深入探讨 LeetCode 第 251 题------"展开二维向量"的问题。通过 Swift 语言,我们不仅会提供可运行的示例代码,还会结合实际场景进行分析,帮助大家更好地理解如何将二维数据结构展平成一维序列,并通过迭代器进行遍历。

描述
问题描述:设计并实现一个迭代器,用于遍历一个二维向量。该迭代器应支持以下操作:
next()
:返回二维向量中的下一个元素,并将指针向前移动一位。hasNext()
:如果存在下一个元素,返回true
;否则,返回false
。
示例:
swift
let vector2D = Vector2D([[1, 2], [3], [4]])
print(vector2D.next()) // 输出 1
print(vector2D.next()) // 输出 2
print(vector2D.next()) // 输出 3
print(vector2D.hasNext()) // 输出 true
print(vector2D.hasNext()) // 输出 true
print(vector2D.next()) // 输出 4
print(vector2D.hasNext()) // 输出 false
注意事项:
- 你可以假设在调用
next()
时,至少存在一个下一个元素。 - 请确保在多个测试用例中,类变量不会被错误地保留。

题解答案
为了解决这个问题,我们需要创建一个 Vector2D
类,内部维护指向当前行和列的索引。通过 next()
方法获取当前元素,并移动索引;通过 hasNext()
方法检查是否还有剩余元素。
题解代码分析
以下是使用 Swift 实现的 Vector2D
类:
swift
class Vector2D {
private var vector: [[Int]]
private var row: Int
private var col: Int
init(_ vec: [[Int]]) {
self.vector = vec
self.row = 0
self.col = 0
moveToNext()
}
func next() -> Int {
let result = vector[row][col]
col += 1
moveToNext()
return result
}
func hasNext() -> Bool {
return row < vector.count
}
private func moveToNext() {
while row < vector.count && col >= vector[row].count {
row += 1
col = 0
}
}
}
代码解析:
-
初始化 :在
init
方法中,我们接受一个二维数组vec
,并初始化row
和col
为 0。然后调用moveToNext()
方法,跳过可能的空行。 -
next() 方法 :返回当前元素,并将
col
增加 1。然后调用moveToNext()
,确保索引指向下一个有效元素。 -
hasNext() 方法 :检查当前
row
是否小于vector
的行数,以判断是否还有剩余元素。 -
moveToNext() 方法 :这是一个辅助方法,用于跳过空行,确保
row
和col
指向一个有效的元素。
示例测试及结果
让我们通过一个示例来测试我们的 Vector2D
类:
swift
let vector2D = Vector2D([[1, 2], [3], [4]])
print(vector2D.next()) // 输出 1
print(vector2D.next()) // 输出 2
print(vector2D.next()) // 输出 3
print(vector2D.hasNext()) // 输出 true
print(vector2D.hasNext()) // 输出 true
print(vector2D.next()) // 输出 4
print(vector2D.hasNext()) // 输出 false
输出结果:
txt
1
2
3
true
true
4
false
时间复杂度
- next() 方法:在最坏情况下,需要跳过多个空行,因此时间复杂度为 O(n),其中 n 是行数。
- hasNext() 方法:同样,最坏情况下时间复杂度为 O(n)。
空间复杂度
该实现仅使用了常数级别的额外空间,因此空间复杂度为 O(1)。
总结
通过上述实现,我们成功地创建了一个能够遍历二维向量的迭代器。这个问题在实际开发中有广泛的应用,例如在处理数据库查询结果时,我们可能需要遍历多行多列的数据;又或者在处理多维数组时,需要将其展平成一维进行处理。希望这篇文章能帮助你更好地理解如何在 Swift 中处理类似的问题。