LeetCode - #194 Swift 实现文件内容转置



网罗开发 (小红书、快手、视频号同名)

大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:极星会首批签约作者

文章目录

摘要

文件内容的转置是数据处理中的基础操作之一,特别是在表格数据处理中。本文将以一个实际问题为例,展示如何用 Swift 实现文件内容的转置功能。通过详细的代码解析和测试结果,帮助读者掌握这一常用技能。

描述

问题

给定一个文件 file.txt,其内容是一个用空格分隔的二维表,每行的列数相同。目标是将文件内容进行转置(行变为列,列变为行),并输出结果。

示例输入 (文件 file.txt 的内容):

txt 复制代码
name age
Alice 21
Ryan 30

期望输出

txt 复制代码
name Alice ryan
age 21 30

题解答案

Swift 代码实现

以下是用 Swift 实现文件转置的完整代码:

swift 复制代码
import Foundation

func transposeFileContent(filePath: String) {
    do {
        // 读取文件内容
        let content = try String(contentsOfFile: filePath)

        // 分割文件内容为行
        let lines = content.split(separator: "\n").map { $0.split(separator: " ") }

        // 获取列数
        guard let columnCount = lines.first?.count else {
            print("空文件或无有效数据")
            return
        }

        // 初始化转置结果的数组
        var transposed: [[String]] = Array(repeating: [String](), count: columnCount)

        // 填充转置结果
        for row in lines {
            for (index, value) in row.enumerated() {
                transposed[index].append(String(value))
            }
        }

        // 格式化输出转置内容
        for row in transposed {
            print(row.joined(separator: " "))
        }
    } catch {
        print("读取文件失败: \(error.localizedDescription)")
    }
}

// 示例调用
let filePath = "path/to/file.txt"
transposeFileContent(filePath: filePath)

题解代码分析

代码步骤解析

  1. 读取文件内容

    • 使用 String(contentsOfFile:) 将文件内容读取为字符串。
    • 通过 split(separator:) 将字符串按行切分为数组。
  2. 数据结构处理

    • 将每行按空格切分为字段数组,构成二维数组 lines
    • 通过列数(第一行的字段数量)初始化一个转置结果的二维数组 transposed
  3. 实现转置

    • 遍历每一行的字段,按列号存入转置数组的对应位置。
    • 例如,第 1 列的所有字段将组成转置后的第 1 行。
  4. 输出转置结果

    • 将转置后的内容逐行打印,字段间用空格连接。

示例测试及结果

输入文件 file.txt

txt 复制代码
name age
Alice 21
Ryan 30

运行代码后输出

txt 复制代码
name Alice ryan
age 21 30

时间复杂度

  1. 文件读取与分割

    • 读取文件内容和按行分割的时间复杂度为 O(n),其中 n 是文件总字符数。
  2. 转置操作

    • 遍历二维数组并填充转置数组,时间复杂度为 O(r * c),其中 r 是行数,c 是列数。
  3. 总时间复杂度

    • 综上,时间复杂度为 O(n + r * c)

空间复杂度

  1. 文件存储

    • 存储原始文件内容和二维数组,空间复杂度为 O(n)
  2. 转置数组

    • 需要额外存储一个大小为 r * c 的二维数组。
  3. 总空间复杂度

    • 空间复杂度为 O(n + r * c)

总结

  1. Swift 的优势

    • 丰富的字符串处理功能和数组操作方法使得实现文件转置更为简洁和高效。
    • 错误处理机制确保了文件读取的可靠性。
  2. 代码优化方向

    • 如果文件内容特别大,可以通过逐行读取并直接处理,减少内存占用。
  3. 应用场景

    • 数据表格转置:常用于 CSV 文件的处理。
    • 数据格式转换:适用于各种文件格式之间的快速转化。

未来展望

  • 支持更复杂的数据格式,例如 CSV 文件中带有逗号和引号的字段。
  • 增加多语言实现对比,例如使用 Python 或 Bash 实现相同功能。
  • 为大型文件处理添加流式读取功能。

参考资料

相关推荐
╰つ゛木槿8 分钟前
深入探索 Vue 3 Markdown 编辑器:高级功能与实现
前端·vue.js·编辑器
珊瑚里的鱼14 分钟前
【单链表算法实战】解锁数据结构核心谜题——环形链表
数据结构·学习·程序人生·算法·leetcode·链表·visual studio
gentle_ice18 分钟前
leetcode——矩阵置零(java)
java·算法·leetcode·矩阵
豆豆(设计前端)21 分钟前
在 Vue 项目中快速引入和使用 ECharts
vue.js
醉の虾1 小时前
VUE3 使用路由守卫函数实现类型服务器端中间件效果
前端·vue.js·中间件
程序边界1 小时前
AIGC时代下的Vue组件开发深度探索
vue.js
sysu632 小时前
95.不同的二叉搜索树Ⅱ python
开发语言·数据结构·python·算法·leetcode·面试·深度优先
码上飞扬2 小时前
Vue 3 30天精进之旅:Day 05 - 事件处理
前端·javascript·vue.js
‘’林花谢了春红‘’2 小时前
Leetcode::3432. 统计元素和差值为偶数的分区方案
算法·leetcode·职场和发展
SsummerC2 小时前
【leetcode100】从前序与中序遍历序列构造二叉树
python·算法·leetcode