从表格到序列:Swift 如何优雅地解 LeetCode 251 展开二维向量


文章目录

摘要

在这篇文章中,我们将深入探讨 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

注意事项

  1. 你可以假设在调用 next() 时,至少存在一个下一个元素。
  2. 请确保在多个测试用例中,类变量不会被错误地保留。

题解答案

为了解决这个问题,我们需要创建一个 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
        }
    }
}

代码解析

  1. 初始化 :在 init 方法中,我们接受一个二维数组 vec,并初始化 rowcol 为 0。然后调用 moveToNext() 方法,跳过可能的空行。

  2. next() 方法 :返回当前元素,并将 col 增加 1。然后调用 moveToNext(),确保索引指向下一个有效元素。

  3. hasNext() 方法 :检查当前 row 是否小于 vector 的行数,以判断是否还有剩余元素。

  4. moveToNext() 方法 :这是一个辅助方法,用于跳过空行,确保 rowcol 指向一个有效的元素。

示例测试及结果

让我们通过一个示例来测试我们的 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 中处理类似的问题。

相关推荐
和沐阳学逆向35 分钟前
我现在怎么用 CC Switch 管中转站,顺手拿 Codex 举个例子
开发语言·javascript·ecmascript
小仙女的小稀罕36 分钟前
听不清重要会议录音急疯?这款常见AI工具听脑AI精准转译
开发语言·人工智能·python
书到用时方恨少!42 分钟前
Python random 模块使用指南:从入门到精通
开发语言·python
客卿1231 小时前
牛客刷题--找数字-- 字符串检测-字符串 双指针
java·开发语言
IronMurphy2 小时前
【算法三十一】46. 全排列
算法·leetcode·职场和发展
czlczl200209252 小时前
力扣1911. 最大交替子序列和
算法·leetcode·动态规划
Amour恋空2 小时前
Java多线程
java·开发语言·python
小陈工2 小时前
2026年3月28日技术资讯洞察:5G-A边缘计算落地、低延迟AI推理革命与工业智造新范式
开发语言·人工智能·后端·python·5g·安全·边缘计算
第二只羽毛2 小时前
C++ 高并发内存池1
大数据·开发语言·c++·开源
不想看见4042 小时前
C++/Qt 实习岗位深度解析【结合一次研发实习谈感受】
开发语言·c++·qt