LeetCode - #195 Swift 实现打印文件中的第十行



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

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

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

文章目录

摘要

在文件处理和文本处理的常见问题中,提取特定行是基础且实用的操作之一。本文将介绍如何使用 Swift 实现从文本文件中提取并打印第十行的功能,并提供多种实现解法。我们将逐步分析每种方法的优缺点,并通过具体的代码示例展示其实际效果。

描述

问题描述

给定一个文本文件 file.txt,要求打印文件中的第十行。如果文件少于十行,则不输出任何内容。

示例

假设 file.txt 内容如下:

txt 复制代码
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10

期望输出

txt 复制代码
Line 10

注意

  • 如果文件少于十行,应当不输出任何内容。

题解答案

为了实现该功能,我们可以使用多种方法来解决问题,包括使用文件操作、字符串分割以及基于流的处理。以下是三种不同的解法。

解法 1:读取整个文件并提取第十行

最直接的方法是一次性读取整个文件的内容,然后提取第十行。

swift 复制代码
import Foundation

func printTenthLine(filePath: String) {
    do {
        let content = try String(contentsOfFile: filePath)
        let lines = content.split(separator: "\n")
        if lines.count >= 10 {
            print(lines[9])  // 输出第十行
        }
    } catch {
        print("Error reading file: \(error.localizedDescription)")
    }
}

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

解法 2:逐行读取文件直到第十行

这种方法不需要一次性读取整个文件,适用于处理大型文件,逐行读取并输出第十行。

swift 复制代码
import Foundation

func printTenthLine(filePath: String) {
    do {
        let fileHandle = try FileHandle(forReadingAtPath: filePath)
        var lineCount = 0
        while let line = fileHandle?.readLine() {
            lineCount += 1
            if lineCount == 10 {
                print(line)
                break
            }
        }
        fileHandle?.closeFile()
    } catch {
        print("Error reading file: \(error.localizedDescription)")
    }
}

// 扩展 FileHandle 以实现按行读取
extension FileHandle {
    func readLine() -> String? {
        let data = self.readData(upToLength: 1024)
        return data.flatMap { String(data: $0, encoding: .utf8) }
    }
}

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

解法 3:使用 Unix 命令行工具

对于简单的文件处理任务,我们也可以通过使用 Shell 命令来实现文件处理。这种方法适用于快速处理小文件。

bash 复制代码
sed -n '10p' file.txt

题解代码分析

解法 1:读取整个文件

  • 优点:简单直观,适合处理小型文件。
  • 缺点:需要将整个文件加载到内存中,对于大文件效率较低,内存占用较大。

解法 2:逐行读取

  • 优点:只加载当前读取的行,适用于大文件。
  • 缺点:需要处理文件的流,代码相对较复杂。

解法 3:使用 Shell 命令

  • 优点:非常简洁且高效,适用于 Unix 环境中的文件处理。
  • 缺点:依赖于操作系统环境,不能直接在 Swift 中运行,适用于简单处理。

示例测试及结果

输入文件 file.txt

txt 复制代码
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10

运行代码后输出

txt 复制代码
Line 10

如果文件少于十行,输出为空。

时间复杂度

  1. 解法 1 :读取整个文件的时间复杂度为 O(n),其中 n 是文件的总字符数。
  2. 解法 2 :逐行读取,时间复杂度为 O(k),其中 k 为读取的行数,最坏情况下为文件总行数。
  3. 解法 3sed 命令的时间复杂度为 O(n),其中 n 是文件的总字符数。

空间复杂度

  1. 解法 1 :需要存储整个文件内容,空间复杂度为 O(n)
  2. 解法 2 :只需要存储当前读取的行,空间复杂度为 O(1)
  3. 解法 3 :空间复杂度为 O(1),因为命令行操作不需要额外内存。

总结

  1. 解法 1:适用于小文件,简单易懂,但对大文件不够高效。
  2. 解法 2:适用于大文件,逐行处理,内存占用小,灵活性强。
  3. 解法 3:适用于 Unix 环境中的简单文件操作,非常简洁,但不适用于所有平台。

未来展望

  1. 在未来的实现中,可以进一步扩展为支持读取文件中任意行。
  2. 探索更多优化方法,尤其在处理大文件时,如何减少不必要的内存占用和提高效率。

参考资料

相关推荐
春天姐姐27 分钟前
vue知识点总结 依赖注入 动态组件 异步加载
前端·javascript·vue.js
Pop–2 小时前
Vue3 el-tree:全选时只返回父节点,半选只返回勾选中的节点(省-市区-县-镇-乡-村-街道)
开发语言·javascript·vue.js
滿2 小时前
Vue3 + Element Plus 动态表单实现
javascript·vue.js·elementui
阿金要当大魔王~~2 小时前
面试问题(连载。。。。)
前端·javascript·vue.js
蒟蒻小袁2 小时前
力扣面试150题-- 翻转二叉树
算法·leetcode·面试
养一只Trapped_beast2 小时前
【LeetCode】删除排序数组中的重复项 II
算法·leetcode·职场和发展
轮到我狗叫了2 小时前
力扣智慧思想小题,目录力扣.跳跃游戏(思想很重要)力扣.跳跃游戏II(还是思想)力扣.分发糖果力扣151.反转字符串中的单词力扣.轮转数组
数据结构·算法·leetcode
MaCa .BaKa3 小时前
37-智慧医疗服务平台(在线接诊/问诊)
java·vue.js·spring boot·tomcat·vue·maven
ドロロ8063 小时前
element-plus点击重置表单,却没有进行重置操作
javascript·vue.js·elementui
1白天的黑夜14 小时前
动态规划-62.不同路径-力扣(LeetCode)
c++·算法·leetcode·动态规划