LeetCode - #195 Swift 实现打印文件中的第十行
大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括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 Foundationfunc 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 Foundationfunc printTenthLine(filePath: String) {do {let fileHandle = try FileHandle(forReadingAtPath: filePath)var lineCount = 0while let line = fileHandle?.readLine() {lineCount += 1if 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:读取整个文件的时间复杂度为
O(n)
,其中n
是文件的总字符数。 - 解法 2:逐行读取,时间复杂度为
O(k)
,其中k
为读取的行数,最坏情况下为文件总行数。 - 解法 3:
sed
命令的时间复杂度为O(n)
,其中n
是文件的总字符数。
空间复杂度
- 解法 1:需要存储整个文件内容,空间复杂度为
O(n)
。 - 解法 2:只需要存储当前读取的行,空间复杂度为
O(1)
。 - 解法 3:空间复杂度为
O(1)
,因为命令行操作不需要额外内存。
总结
- 解法 1:适用于小文件,简单易懂,但对大文件不够高效。
- 解法 2:适用于大文件,逐行处理,内存占用小,灵活性强。
- 解法 3:适用于 Unix 环境中的简单文件操作,非常简洁,但不适用于所有平台。
未来展望
- 在未来的实现中,可以进一步扩展为支持读取文件中任意行。
- 探索更多优化方法,尤其在处理大文件时,如何减少不必要的内存占用和提高效率。
参考资料
- Swift 官方文档
- sed 命令手册
相关文章:

LeetCode - #195 Swift 实现打印文件中的第十行
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
机试题——最小矩阵宽度
题目描述 给定一个矩阵,包含 N * M 个整数,和一个包含 K 个整数的数组。 现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数。 输入描述 第一行输入两个正整数 N,M,表示矩阵大小。 接下…...

香港维尔利健康科技集团重金投资,内地多地体验中心同步启动
香港维尔利健康科技集团近期宣布,将投资数亿港元在内地多个城市建立全新的健康科技体验中心。这一战略举措旨在进一步拓展集团在内地市场的布局,推动创新医疗技术的普及和应用。 多地布局,覆盖主要城市 据悉,维尔利健康科技集团将…...

ZYNQ-IP-AXI-GPIO
AXI GPIO 可以将 PS 端的一个 AXI 4-Lite 接口转化为 GPIO 接口,并且可以被配置为单端口或双端口,每个通道的位宽可以独立配置。 通过使能三态门可以将端口动态地配置为输入或输出。 AXIGPIO 是 ZYNQ PL 端的一个 IP 核,可以将 AXI-Lite Mas…...

Netty的心跳机制怎么实现的?
大家好,我是锋哥。今天分享关于【Netty的心跳机制怎么实现的?】面试题。希望对大家有帮助; Netty的心跳机制怎么实现的? Netty的心跳机制主要是通过在客户端和服务器之间定期发送特殊的数据包(比如空消息或自定义的控…...

java基础——专题一 《面向对象之前需要掌握的知识》
目录 Δ前言 一、拾枝杂谈 1.Java是什么? 2.计组前瞻: 3.JDK,JRE,JVM? 二、环境搭建 1.JDK安装和配置: 1.1 人话 1.2 JDK的配置 1.3 如何切换JDK的版本? 2.DOS的简单使用: 2.1 介…...
Python 数据清洗与处理常用方法全解析
在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战。本文总结了多种数据清洗与处理方法:缺失值处理包括删除缺失值、固定值填充、前后向填充以及删除缺失率高的列;重复值处理通过删除或标记重复项解决数据冗余问题࿱…...
BFS算法的实现(例题)
这是C算法基础-搜索与图论专栏的第X篇文章,专栏详情请见此处。 引入 上篇博客,我们学习了BFS算法的大体套路,这次,我将会通过两个例题来更详细的讲解。 下面我们就来讲BFS算法(例题)的实现。 过程 例题1&a…...
clean code阅读笔记——如何命名?
命名的原则 1. “小处诚实非小事“ 有个词叫做”以小见大“。以建筑作喻,宏大建筑中最细小的部分,比如关不紧的门、未铺平的地板,甚至时凌乱的桌面,都会将整个大局的魅力毁灭殆尽,这就是整洁代码之所系。 2. 有意义…...

MacOS 如何解决无法打开 ‘xxx’,因为 Apple 无法检查其是否包含恶意软件
背景 在安装软件时,遇到“无法打开 ‘xxx’,因为 Apple 无法检查其是否包含恶意软件” 的提示,许多用户可能会感到困惑,不知道该如何处理。遇到这个问题时,按以下步骤操作即可解决。 首先,这个警告提示的出…...
Java并发学习:进程与线程的区别
进程的基本原理 一个进程是一个程序的一次启动和执行,是操作系统程序装入内存,给程序分配必要的系统资源,并且开始运行程序的指令。 同一个程序可以多次启动,对应多个进程,例如同一个浏览器打开多次。 一个进程由程…...

省市区三级联动
引言 在网页中,经常会遇到需要用户选择地区的场景,如注册表单、地址填写等。为了提供更好的用户体验,我们可以实现一个三级联动的地区选择器,让用户依次选择省份、城市和地区。 效果展示: 只有先选择省份后才可以选择…...
springboot 动态配置定时任务
要在Spring Boot中动态配置定时任务,可以使用ScheduledTaskRegistrar类来实现。 首先,创建一个定时任务类,该类需要实现Runnable接口。例如: Component public class MyTask implements Runnable {Overridepublic void run() {/…...

数据结构与算法学习笔记----求组合数
数据结构与算法学习笔记----求组合数 author: 明月清了个风 first publish time: 2025.1.27 ps⭐️一组求组合数的模版题,因为数据范围的不同要用不同的方法进行求解,涉及了很多之前的东西快速幂,逆元,质数,高精度等…...

Arouter详解・常见面试题
前言:ARouter是一个用于 Android App 进行组件化改造的路由框架 —— 支持模块间的路由、通信、解耦。 一、路由简介: 路由:就是通过互联的网络把信息从源地址传输到目的地址的活动。完成路由这个操作的实体设备就是 路由器(Rout…...

全志开发板 视频输入框架
笔记来源于百问网出品的教程。 1.VIN camera驱动框架 • 使用过程中可简单的看成是vin 模块 device 模块af driver flash 控制模块的方式; • vin.c 是驱动的主要功能实现,包括注册/注销、参数读取、与v4l2 上层接口、与各device 的下层接口、中断处…...
寒假学web--day10
简介 一些高级的反序列化 phar反序列化 phar类似于java的jar包,将多个php文件合并为独立的压缩包,不用解压就能执行里面的php文件,支持web服务器和命令行 metadata $phar->setmetadata($h); metadata可以存放一个类实例,…...

【全栈】SprintBoot+vue3迷你商城(9)
【全栈】SprintBootvue3迷你商城(9) 往期的文章都在这里啦,大家有兴趣可以看一下 后端部分: 【全栈】SprintBootvue3迷你商城(1) 【全栈】SprintBootvue3迷你商城(2) 【全栈】Spr…...

系统思考—问题分析
很多中小企业都在面对转型的难题:市场变化快,资源有限,团队协作不畅……这些问题似乎总是困扰着我们。就像最近和一位企业主交流时,他提到:“我们团队每天都很忙,但效率始终没见提升,感觉像是在…...

系统架构设计师教材:信息系统及信息安全
信息系统 信息系统的5个基本功能:输入、存储、处理、输出和控制。信息系统的生命周期分为4个阶段,即产生阶段、开发阶段、运行阶段和消亡阶段。 信息系统建设原则 1. 高层管理人员介入原则:只有高层管理人员才能知道企业究竟需要什么样的信…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...