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];
};

 

posted on 2014-12-25 11:08  higerzhang  阅读(1707)  评论(0编辑  收藏  举报