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];
    };
  • 相关阅读:
    是河南大学的悲哀???
    装完manjaro先要卸载
    技术博客
    VIM从入门到中级教程
    HTTP中GET与POST的区别
    AngularJS 拦截器实现全局$http请求loading效果
    angular指令监听ng-repeat渲染完成后执行自定义事件方法
    icheck如何修改样式大小
    Sublime text3 代码格式化插件
    代理模式小试
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4184183.html
Copyright © 2011-2022 走看看