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

posted @ 2018-11-12 12:57  約束の空  阅读(362)  评论(0编辑  收藏  举报