码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-02-28 10:40:30      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:logs   file   不为   ref   www   难点   cas   new   using   

The API: int read4(char *buf) reads 4 characters at a time from a file.

The return value is the actual number of characters read. For example, it returns 3 if there is only 3 characters left in the file.

By using the read4 API, implement the function int read(char *buf, int n) that reads n characters from the file.

Note:
The read function may be called multiple times.

157. Read N Characters Given Read4 的拓展,之前只能调用一次,而这里可以调用多次,又多了一些corner case:

第一次调用时,如果read4读出的多余字符我们要先将其暂存起来,这样第二次调用时先读取这些暂存的字符

第二次调用时,如果连暂存字符都没读完,那么这些暂存字符还得留给第三次调用时使用

所以,难点就在于怎么处理这个暂存字符。因为用数组和指针控制对第二种情况比较麻烦,且这些字符满足先进先出,所以我们可以用一个队列暂存这些字符。这样,只要队列不为空,就先读取队列。

Java: Time: O(n), Space: O(1)

public class Solution extends Reader4 {
    Queue<Character> remain = new LinkedList<Character>();
    
    public int read(char[] buf, int n) {
        int i = 0;
        // 队列不为空时,先读取队列中的暂存字符
        while(i < n && !remain.isEmpty()){
            buf[i] = remain.poll();
            i++;
        }
        for(; i < n; i += 4){
            char[] tmp = new char[4];
            int len = read4(tmp);
            // 如果读到字符多于我们需要的字符,需要暂存这些多余字符
            if(len > n - i){
                System.arraycopy(tmp, 0, buf, i, n - i);
                // 把多余的字符存入队列中
                for(int j = n - i; j < len; j++){
                    remain.offer(tmp[j]);
                }
            // 如果读到的字符少于我们需要的字符,直接拷贝
            } else {
                System.arraycopy(tmp, 0, buf, i, len);
            }
            // 同样的,如果读不满4个,说明数据已经读完,返回总所需长度和目前已经读到的长度的较小的
            if(len < 4) return Math.min(i + len, n);
        }
        // 如果到这里,说明都是完美读取,直接返回n
        return n;
    }
}

 

相关题目:

[LeetCode] 157. Read N Characters Given Read4 用Read4来读取N个字符 

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

标签:logs   file   不为   ref   www   难点   cas   new   using   

原文地址:https://www.cnblogs.com/lightwindy/p/8481800.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!