Article / 文章

LeetCode 第195题:第十行

给定一个文本文件 file.txt,请只打印这个文件中的第十行。

题目描述

给定一个文本文件 file.txt,请只打印这个文件中的第十行。

难度

简单

题目链接

点击在LeetCode中查看题目

示例

示例:

假设 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. 如果文件少于十行,你应当输出什么?
  2. 至少有三种不同的解法,请尝试尽可能多的方法来解题。

解题思路

方法一:使用head和tail命令

这是最直接的方法,使用head命令获取文件的前10行,然后使用tail命令获取最后一行,即第10行。

关键点:

  1. head -n 10 获取文件的前10行
  2. tail -n 1 获取这10行中的最后一行

时间复杂度:O(1),只处理固定行数 空间复杂度:O(1),只需要常数额外空间

方法二:使用sed命令

sed是一个强大的流编辑器,可以指定只打印特定行号的内容。

关键点:

  1. 使用 sed -n '10p' 表示只打印第10行
  2. -n 参数表示不输出默认内容

时间复杂度:O(n),其中n是文件的行数,需要遍历到第10行 空间复杂度:O(1),只需要常数额外空间

方法三:使用awk命令

awk也可以根据行号进行过滤和处理。

关键点:

  1. 使用 awk 'NR==10' 表示只处理第10行
  2. NR 表示当前处理的行号

时间复杂度:O(n),其中n是文件的行数,需要遍历到第10行 空间复杂度:O(1),只需要常数额外空间

方法四:使用纯粹的bash脚本

如果不希望依赖外部命令,可以使用纯粹的bash脚本实现。

关键点:

  1. 使用循环读取文件的每一行
  2. 计数直到第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 不依赖外部命令,可移植性好

补充说明

代码亮点

  1. 所有方法都很简洁,单行即可解决问题
  2. 方法一的组合命令直观易理解
  3. 方法二和方法三使用单一命令,效率高
  4. 方法四虽然较长,但是不依赖特定的Unix工具,可移植性好

空文件或不足10行的处理

  1. 对于head和tail组合的方法:如果文件少于10行,head命令会输出所有行,然后tail命令会输出最后一行,即最后一行而不是第10行
  2. 对于sed和awk方法:如果文件少于10行,这些命令不会输出任何内容,符合要求
  3. 对于bash脚本方法:如果文件少于10行,循环结束后不会执行echo命令,因此不会输出任何内容,符合要求

常见错误

  1. 没有考虑文件行数不足10行的情况
  2. 使用了不可移植的Unix命令参数
  3. 在方法一中使用了管道,如果要求不使用管道则不适用
  4. bash脚本方法中没有正确处理文件读取结束的情况

相关题目