1. 程式人生 > >LeetCode 157,158. Read N Characters Given Read4 I+II

LeetCode 157,158. Read N Characters Given Read4 I+II

Read N Characters Given Read4

這個題目和C裡面讀檔案很像。

read4每次只能讀四個字元,把字元放到buf裡,返回值是實際讀到的字元數。

而我們要做的是用read4實現一個能夠讀n個字元的函式 read,同樣,讀到的字元放到buf裡。

if (count==0) break; 是處理檔案長度比n小的情況。

// Forward declaration of the read4 API.
int read4(char *buf);

class Solution {
public:
    /**
     * @param buf Destination buffer
     * @param n   Maximum number of characters to read
     * @return    The number of characters read
     
*/ int read(char *buf, int n) { char* tmp=new char[4]; int len=0; while (len<n){ int count=read4(tmp); if (count==0) break; int i=0; while (len<n && i<count) buf[len++] = tmp[i++]; }
return len; } };

當然,由於C++指標的緣故,也可以直接read4放到 buf+index 的位置。

 

Read N Characters Given Read4 II - Call multiple times

上一題的followup,其中與上一題有很大的區別。

由於需要多次read,下一次read是緊接在之前讀完的字元之後的。這裡有一個問題,如果之前read4的字元讀多了怎麼辦?

因此,我們需要一個cache,暫存read4的內容。如果有剩下的,下一次讀的時候先把剩下的讀了,如果還不夠再call read4。

// Forward declaration of the read4 API.
int read4(char *buf); class Solution { public: /** * @param buf Destination buffer * @param n Maximum number of characters to read * @return The number of characters read */ char *cache=new char[4]; int index=0; // points to the first remaining char int count=0; // valid number of characters in cache int read(char *buf, int n) { int len=0; while (len<n){ while (len<n && index<count){ buf[len++] = cache[index++]; } if (len==n) break; count=read4(cache); if (count==0) break; index = 0; } return len; } };

 

 

References:

https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/discuss/141946/My-Concise-c++-solution