[CareerCup] 13.1 Print Last K Lines 列印最後K行

Grandyang發表於2015-10-29

 

13.1 Write a method to print the last K lines of an input file using C++.

 

這道題讓我們用C++來列印一個輸入文字的最後K行,最直接的方法是先讀入所有的資料,統計文字的總行數,然後再遍歷一遍列印出最後K行。這個方法需要讀兩遍檔案,我們想使用一種更簡便的方法,只需要讀取一遍文字就可以列印出最後K行,這裡我們使用一個迴圈陣列Circular Array,原理是我們維護一個大小為K的字串陣列,當陣列存滿後,新進來的資料從開頭開始存,覆蓋原有的資料。這樣當我們讀完整個文字,最後K行就儲存在了這個大小為K的字串陣列,只不過順序不相同,我們始終要有個變數來記錄最後一個進來的資料的位置,這樣我們就可以按原文字的順序列印出最後K行了,參見程式碼如下:

 

class Solution {
public:
    void printLast5Lines(char *fileName) {
        const int K = 5;
        ifstream file(fileName);
        string L[K];
        int size = 0;
        while (file.good()) {
            getline(file, L[size % K]);
            ++size;
        }
        int start = size > K ? (size % K) : 0;
        int cnt = min(K, size);
        for (int i = 0; i < cnt; ++i) {
            cout << L[(start + i) % K] << endl;
        }
    }
};

 

相關文章