leetcode[158] Read N Characters Given Read4 II - Call multiple times

想了好一会才看懂题目意思,应该是:

这里指的可以调用更多次,是指对一个文件多次操作,也就是对于一个case进行多次的readn操作。上一题是只进行一次reandn,所以每次返回的是文件的长度或者是n,并且将相应的字符存在buf里。现在调用多次的话就可能存在以下的例子:

例如文件case是:1,2,3,4,5,6,7

如果要实现read5,先用read4读四个到buf,再用read4读剩下的3个到buf+4之后,但是read5一次最多读5个到buf,所以read4多读的2个就要存起来,防止下次调用read5的时候用。

参见这里,用全局变量记录之前访问的是否有溢出。

// 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

     */

    Solution() : buf_len(0) {

        

    }

    int read(char *buf, int n) {

        char buffer[5];

        int cnt = 0;

        if (buf_len > 0) {

            memcpy(buf, _buf, min(buf_len, n));

            cnt += min(buf_len, n);

            if (n < buf_len) {

                memcpy(_buf, _buf + n, buf_len - n);

                buf_len -= n;

            } else {

                buf_len = 0;

            }

        }

        int sz;

        while(cnt < n) {

            sz = read4(buffer);

            memcpy(buf + cnt, buffer, sz);

            cnt += sz;

            if (sz < 4) break;

        }

        if (cnt > n) {

            buf[n] = '\0';

            buf_len = cnt - n;

            memcpy(_buf, buffer + (sz-buf_len), buf_len);

            cnt = n;

        }

        return cnt;

    }

private:

    int buf_len;

    char _buf[5];

};

 

你可能感兴趣的:(character)