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

news2025/5/11 3:39:12

在这里插入图片描述
在这里插入图片描述

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

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

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

文章目录

    • 摘要
    • 描述
    • 题解答案
      • 解法 1:读取整个文件并提取第十行
      • 解法 2:逐行读取文件直到第十行
      • 解法 3:使用 Unix 命令行工具
    • 题解代码分析
      • 解法 1:读取整个文件
      • 解法 2:逐行读取
      • 解法 3:使用 Shell 命令
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结
    • 未来展望
    • 参考资料

摘要

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

描述

问题描述

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

示例
假设 file.txt 内容如下:

Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10

期望输出

Line 10

注意

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

题解答案

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

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

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

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:逐行读取文件直到第十行

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

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 命令来实现文件处理。这种方法适用于快速处理小文件。

sed -n '10p' file.txt

题解代码分析

解法 1:读取整个文件

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

解法 2:逐行读取

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

解法 3:使用 Shell 命令

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

示例测试及结果

输入文件 file.txt

Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10

运行代码后输出

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. 探索更多优化方法,尤其在处理大文件时,如何减少不必要的内存占用和提高效率。

参考资料

  • Swift 官方文档
  • sed 命令手册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2284386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强化学习数学原理(三)——值迭代

一、值迭代过程 上面是贝尔曼最优公式,之前我们说过,f(v)v,贝尔曼公式是满足contraction mapping theorem的,能够求解除它最优的策略和最优的state value,我们需要通过一个最优v*,这个v*来计算状态pi*&…

DeepSeek-R1:强化学习驱动的推理模型

1月20日晚,DeepSeek正式发布了全新的推理模型DeepSeek-R1,引起了人工智能领域的广泛关注。该模型在数学、代码生成等高复杂度任务上表现出色,性能对标OpenAI的o1正式版。同时,DeepSeek宣布将DeepSeek-R1以及相关技术报告全面开源。…

scratch变魔术 2024年12月scratch三级真题 中国电子学会 图形化编程 scratch三级真题和答案解析

目录 scratch变魔术 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、 推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、py…

MyBatis框架基础学习及入门案例(2)

目录 一、数据库建表(tb_user)以及添加数据。 (1)数据库与数据表说明。 (2)字段与数据说明。 二、创建模块(或工程)、导入对应所需依赖坐标。 三、编写MyBatis核心主配置文件。(解决JDBC中"硬编码"问题) (1&…

python学opencv|读取图像(四十六)使用cv2.bitwise_or()函数实现图像按位或运算

【0】基础定义 按位与运算:全1取1,其余取0。按位或运算:全0取0,其余取1。 【1】引言 前序学习进程中,已经对图像按位与计算进行了详细探究,相关文章链接如下: python学opencv|读取图像&…

蓝桥杯省一

四个月从c,cpp,算法一起学到省一(考研原因没参加国赛) 有疑问可以关注私信哦 帖子后续也会持续更新,分享算法竞赛(ccpc,天梯赛,蓝桥杯,浙大pta)相关知识

C++ 新特性实现 ThreadPool

序言 在之前我们实现过线程池,但是非常基础。答题思路就是实现一个安全的队列,再通过 ThreadPool 来管理队列和线程,对外提供一个接口放入需要执行的函数,但是这个函数是无参无返回值的。  参数的问题我们可以使用 bind 来封装&a…

【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参

目录 1. 第一版代码 2. 第二版代码 3. 第三版代码 前文已介绍无头单向不循环链表的实现,详见下文: 【数据结构】_不带头非循环单向链表-CSDN博客 但对于部分方法如尾插、头插、任意位置前插入、任意位置前删除的相关实现,其形参均采用了…

本地Harbor仓库搭建流程

Harbor仓库搭建流程 本文主要介绍如何搭建harbor仓库,推送本地镜像供其他机器拉取构建服务 harbor文档:Harbor 文档 | 配置 Harbor YML 文件 - Harbor 中文 github下载离线安装包 Releases goharbor/harbor 这是harbor的GitHub下载地址&#xff0c…

环境搭建--vscode

vscode官网下载合适版本 安装vscode插件 安装 MinGW 配置环境变量 把安装目录D:\mingw64 配置在用户的环境变量path里即可 选择用户环境变量path 点确定保存后开启cmd输入g,如提示no input files 则说明Mingw64 安装成功,如果提示g 不是内…

30289_SC65XX功能机MMI开发笔记(ums9117)

建立窗口步骤: 引入图片资源 放入图片 然后跑make pprj new job8 可能会有bug,宏定义 还会有开关灯报错,看命令行注释掉 接着把ture改成false 然后命令行new一遍,编译一遍没报错后 把编译器的win文件删掉, 再跑一遍虚拟机命令行…

IDEA工具下载、配置和Tomcat配置

1. IDEA工具下载、配置 1.1. IDEA工具下载 1.1.1. 下载方式一 官方地址下载 1.1.2. 下载方式二 官方地址下载:https://www.jetbrains.com/idea/ 1.1.3. 注册账户 官网地址:https://account.jetbrains.com/login 1.1.4. JetBrains官方账号注册…

【10.2】队列-设计循环队列

一、题目 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普…

多人-多agent协同可能会挑战维纳的反馈

在多人-多Agent协同系统中,维纳的经典反馈机制将面临新的挑战,而协同过程中的“算计”(策略性决策与协调)成为实现高效协作的核心。 1、非线性与动态性 维纳的反馈理论(尤其是在控制理论中)通常假设系统的动…

HarmonyOS简介:应用开发的机遇、挑战和趋势

问题 更多的智能设备并没有带来更好的全场景体验 连接步骤复杂数据难以互通生态无法共享能力难以协同 主要挑战 针对不同设备上的不同操作系统,重复开发,维护多套版本 多种语言栈,对人员技能要求高 多种开发框架,不同的编程…

Edge-TTS在广电系统中的语音合成技术的创新应用

Edge-TTS在广电系统中的语音合成技术的创新应用 作者:本人是一名县级融媒体中心的工程师,多年来一直坚持学习、提升自己。喜欢Python编程、人工智能、网络安全等多领域的技术。 摘要 随着人工智能技术的快速发展,文字转语音(Te…

2025课题推荐——USBL与DVL数据融合的实时定位系统

准确的定位技术是现代海洋探测、海洋工程和水下机器人操作的基础。超短基线(USBL)和多普勒速度计(DVL)是常用的水下定位技术,但单一技术难以应对复杂环境。因此,USBL与DVL的数据融合以构建实时定位系统&…

RK3588平台开发系列讲解(ARM篇)ARM64底层中断处理

文章目录 一、异常级别二、异常分类2.1、同步异常2.2、异步异常三、中断向量表沉淀、分享、成长,让自己和他人都能有所收获!😄 一、异常级别 ARM64处理器确实定义了4个异常级别(Exception Levels, EL),分别是EL0到EL3。这些级别用于管理处理器的特权级别和权限,级别越高…

MyBatis最佳实践:提升数据库交互效率的秘密武器

第一章:框架的概述: MyBatis 框架的概述: MyBatis 是一个优秀的基于 Java 的持久框架,内部对 JDBC 做了封装,使开发者只需要关注 SQL 语句,而不关注 JDBC 的代码,使开发变得更加的简单MyBatis 通…

Three.js实战项目02:vue3+three.js实现汽车展厅项目

文章目录 实战项目02项目预览项目创建初始化项目模型加载与展厅灯光加载汽车模型设置灯光材质设置完整项目下载实战项目02 项目预览 完整项目效果: 项目创建 创建项目: pnpm create vue安装包: pnpm add three@0.153.0 pnpm add gsap初始化项目 修改App.js代码&#x…