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. 高层管理人员介入原则:只有高层管理人员才能知道企业究竟需要什么样的信…...

美国三种主要的个人数据产业模式简析
文章目录 前言一、个人征信(Credit Reporting)模式1、定义:2、特点:数据来源:核心功能:服务对象:代表性公司:监管框架:示例应用:二、面向垂直场景的个人数据公司(Consumer Reporting,消费者报告模式)1、定义:2、特点:数据来源:核心功能:服务对象:主要公司:监…...

js手撕 | 使用css画一个三角形 使用js修改元素样式 驼峰格式与“-”格式相互转化
1.使用css画一个三角形 借助 border 实现,在 width 和 height 都为 0 时,设置 border,便会呈现三角形。想要哪个方向的三角形,设置其他三边为 透明即可。同时,可以通过调整不同边的宽度,来调整三角形的高度…...

每日一道算法题
题目:最长递增子序列的个数 给定一个未排序的整数数组,找到最长递增子序列的个数。 示例 1 输入:nums [1,3,5,4,7]输出:2解释:有两个最长递增子序列,分别是 [1,3,4,7] 和 [1,3,5,7] 。 示例 2 输入&a…...

低代码系统-产品架构案例介绍、明道云(十一)
明道云HAP-超级应用平台(Hyper Application Platform),其实就是企业级应用平台,跟微搭类似。 通过自设计底层架构,兼容各种平台,使用低代码做到应用搭建、应用运维。 企业级应用平台最大的特点就是隐藏在冰山下的功能很深…...

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(三)
Understanding Diffusion Models: A Unified Perspective(三) 文章概括 文章概括 引用: article{luo2022understanding,title{Understanding diffusion models: A unified perspective},author{Luo, Calvin},journal{arXiv preprint arXiv:…...

利用机器学习创建基于位置的推荐程序
推荐系统被广泛应用于不同的应用程序中,用于预测用户对产品或服务的偏好或评价。在过去的几分钟或几小时里,你很可能在网上遇到过或与某种类型的推荐系统进行过互动。这些推荐系统有不同的类型,其中最突出的包括基于内容的过滤和协作过滤。在…...

每日一题 429. N 叉树的层序遍历
429. N 叉树的层序遍历 /*class Solution { public:vector<vector<int>> levelOrder(Node* root) {queue<Node*> que;que.push(root);vector<vector<int>> ans;if(root nullptr){return ans;}while(!que.empty()){int sizeQue que.size();vec…...

AIP-132 标准方法:List
编号132原文链接AIP-132: Standard methods: List状态批准创建日期2019-01-21更新日期2022-06-02 在许多API中,通常会向集合URI(例如 /v1/publishers/1/books )发出GET请求,获取集合中资源的列表。 面向资源设计(AIP…...

CSAPP学习:前言
前言 本书简称CS:APP。 背景知识 一些基础的C语言知识 如何阅读 Do-做系统 在真正的系统上解决具体的问题,或是编写和运行程序。 章节 2025-1-27 个人认为如下章节将会对学习408中的操作系统与计算机组成原理提供帮助,于是先凭借记忆将其简单…...
【统计的思想】假设检验(二)
假设检验是根据人为设定的显著水平,对被测对象的总体质量特性进行统计推断的方法。 如果我们通过假设检验否定了零假设,只是说明在设定的显著水平下,零假设成立的概率比较小,并不是说零假设就肯定不成立。如果零假设事实上是成立…...