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 实现相同功能。
  • 为大型文件处理添加流式读取功能。

参考资料

相关推荐
BillKu17 分钟前
Axios中POST、PUT、PATCH用法区别
前端·vue.js
asom2221 分钟前
LeetCode Hot100(字串)
算法·leetcode
源码云商2 小时前
基于 SpringBoot + Vue 的海滨体育馆管理系统设计与实现
vue.js·spring boot·后端
2301_794461572 小时前
力扣-将x减到0的最小操作数
数据结构·算法·leetcode
星沁城3 小时前
108. 将有序数组转换为二叉搜索树
java·数据结构·leetcode
会飞的鱼先生4 小时前
vue3自定义指令来实现 v-copy 功能
前端·javascript·vue.js
姬公子5216 小时前
leetcode hot100刷题日记——9.矩阵置零
算法·leetcode·矩阵
十年一觉尘与土7 小时前
74. 搜索二维矩阵
leetcode
sql123456789118 小时前
Vue-js
前端·javascript·vue.js
何日成熟9 小时前
修改 vue-pdf 源码升级 pdfjs-dist 包, 以解决部分 pdf 文件显示花屏问题
前端·vue.js·pdf