Article / 文章
LeetCode 第195题:第十行
给定一个文本文件 file.txt,请只打印这个文件中的第十行。
题目描述
给定一个文本文件 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
说明:
- 如果文件少于十行,你应当输出什么?
- 至少有三种不同的解法,请尝试尽可能多的方法来解题。
解题思路
方法一:使用head和tail命令
这是最直接的方法,使用head命令获取文件的前10行,然后使用tail命令获取最后一行,即第10行。
关键点:
head -n 10获取文件的前10行tail -n 1获取这10行中的最后一行
时间复杂度:O(1),只处理固定行数 空间复杂度:O(1),只需要常数额外空间
方法二:使用sed命令
sed是一个强大的流编辑器,可以指定只打印特定行号的内容。
关键点:
- 使用
sed -n '10p'表示只打印第10行 -n参数表示不输出默认内容
时间复杂度:O(n),其中n是文件的行数,需要遍历到第10行 空间复杂度:O(1),只需要常数额外空间
方法三:使用awk命令
awk也可以根据行号进行过滤和处理。
关键点:
- 使用
awk 'NR==10'表示只处理第10行 NR表示当前处理的行号
时间复杂度:O(n),其中n是文件的行数,需要遍历到第10行 空间复杂度:O(1),只需要常数额外空间
方法四:使用纯粹的bash脚本
如果不希望依赖外部命令,可以使用纯粹的bash脚本实现。
关键点:
- 使用循环读取文件的每一行
- 计数直到第10行
时间复杂度:O(n),其中n是文件的行数,需要遍历到第10行 空间复杂度:O(1),只需要常数额外空间
代码实现
方法一:使用head和tail命令
head -n 10 file.txt | tail -n 1
方法二:使用sed命令
sed -n '10p' file.txt
方法三:使用awk命令
awk 'NR==10' file.txt
方法四:使用纯粹的bash脚本
count=0
while read line && [ $count -lt 10 ]; do
count=$((count+1))
if [ $count -eq 10 ]; then
echo $line
exit 0
fi
done < file.txt
性能分析
各方法的性能对比:
| 方法 | 执行用时 | 内存消耗 | 特点 |
|---|---|---|---|
| 方法一 | 0 ms | 3.0 MB | 组合使用两个命令,概念清晰 |
| 方法二 | 0 ms | 3.0 MB | 单一命令,简洁高效 |
| 方法三 | 0 ms | 3.0 MB | 单一命令,简洁高效 |
| 方法四 | 4 ms | 3.2 MB | 不依赖外部命令,可移植性好 |
补充说明
代码亮点
- 所有方法都很简洁,单行即可解决问题
- 方法一的组合命令直观易理解
- 方法二和方法三使用单一命令,效率高
- 方法四虽然较长,但是不依赖特定的Unix工具,可移植性好
空文件或不足10行的处理
- 对于head和tail组合的方法:如果文件少于10行,head命令会输出所有行,然后tail命令会输出最后一行,即最后一行而不是第10行
- 对于sed和awk方法:如果文件少于10行,这些命令不会输出任何内容,符合要求
- 对于bash脚本方法:如果文件少于10行,循环结束后不会执行echo命令,因此不会输出任何内容,符合要求
常见错误
- 没有考虑文件行数不足10行的情况
- 使用了不可移植的Unix命令参数
- 在方法一中使用了管道,如果要求不使用管道则不适用
- bash脚本方法中没有正确处理文件读取结束的情况