zoukankan      html  css  js  c++  java
  • leetcode[158] Read N Characters Given Read4 II

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

    这里指的可以调用更多次,是指对一个文件多次操作,也就是对于一个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] = '';
                buf_len = cnt - n;
                memcpy(_buf, buffer + (sz-buf_len), buf_len);
                cnt = n;
            }
            return cnt;
        }
    private:
        int buf_len;
        char _buf[5];
    };
  • 相关阅读:
    PAT 1012 数字分类
    PAT 1046 划拳
    PAT 1021 个位数统计
    PAT 1003 我要通过!
    PAT 1031 查验身份证
    安装swoole
    PHP yield 分析,以及协程的实现,超详细版(上)
    PHP性能优化利器:生成器 yield理解
    swoole深入学习 8. 协程 转
    swoole| swoole 协程初体验 转
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4184183.html
Copyright © 2011-2022 走看看