《程序员面试金典》(第六版)习题:仅为记录一下以加强印象,不为商业用途,如有侵权请联系删除。以下源码和解释参考了书中源码以及解释。
算法只读取一次文件。算法首先建立一个有k个元素的string数组,然后读取文件的每一行然后放入数组中对应的元素,第一行放入
i
n
d
e
x
=
0
index=0
index=0的数组元素,…,第k行放入
i
n
d
e
x
=
k
−
1
index=k-1
index=k−1的数组元素,…,第n行放入
i
n
d
e
x
=
(
n
−
1
)
index=(n-1)%k
index=(n−1)的数组元素。所以如果文件的行数远远大于k时,数组中的元素会不断的被覆盖为新的行的内容,但是内存中永远只保留有文件中的k行。算法最后会按在原文件中原有的行顺序输出文件的最后K行,例如如果文件有10行,
k
=
3
k=3
k=3,则算法最后会按在原文件中原有的行顺序输出第8行,第9行,第10行的内容而不会出现打乱原有的行顺序而输出文件的最后K行。
i
n
p
u
t
.
t
x
t
input.txt
input.txt文件见10.7节。
void printLastKLines(int k, string filePath)
{
ifstream inputFile;
inputFile.open(filePath, ifstream::in);
assert(inputFile.is_open());
vector<string> lines(k);
int size = 0;
while (inputFile.peek()!=EOF)
{
getline(inputFile, lines[size % k]);
size++;
}
inputFile.close();
//下面的代码保证算法最后会按在原文件中原有的行顺序输出文件的最后K行
int start = size > k?(size % k) :0;
int count = min(k, size);
for (int i = 0; i < count; i++)
{
cout << lines[(start + i) % k] << endl;
}
}
int main()
{
int k = 10;
string filePath = "D:\\input.txt";
printLastKLines(k,filePath);
}