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

参考资料

相关推荐
刘一说11 分钟前
Vue 组件不必要的重新渲染问题解析:为什么子组件总在“无故”刷新?
前端·javascript·vue.js
fanruitian1 小时前
uniapp 创建项目
javascript·vue.js·uni-app
刘一说2 小时前
Vue 导航守卫未生效问题解析:为什么路由守卫不执行或逻辑失效?
前端·javascript·vue.js
一周七喜h2 小时前
在Vue3和TypeScripts中使用pinia
前端·javascript·vue.js
东东5163 小时前
基于vue的电商购物网站vue +ssm
java·前端·javascript·vue.js·毕业设计·毕设
Ll13045252983 小时前
Leetcode二叉树 part1
b树·算法·leetcode
松树戈4 小时前
滥用AI生图引起的JavaScript heap out of memory排查记录
vue.js·ai编程
yangzheui6 小时前
【VUE2转VUE3学习笔记】-Day1:模板语法
vue.js·笔记·学习
鱼跃鹰飞6 小时前
Leetcode:97.交错字符串
linux·服务器·leetcode
A_nanda6 小时前
c# 用VUE+elmentPlus生成简单管理系统
javascript·vue.js·c#