LeetCode Read N Characters Given Read4 II - Call multiple times

原题链接在这里:https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/

题目:

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.

题解:

Read N Characters Given Read4类似。

需要多次调用,用queue来保存前一次调用read4没用完的数据. read时先用queue中的数据添加到buf中,若是不够再call read4. 

在读够n个char后若是read4Buff中还有可用数据,加到queue中. 

Time Complexity: O(n). Space: O(1). queue的大小不会超过4.

AC Java:

 1 /* The read4 API is defined in the parent class Reader4.
 2       int read4(char[] buf); */
 3 
 4 public class Solution extends Reader4 {
 5     /**
 6      * @param buf Destination buffer
 7      * @param n   Maximum number of characters to read
 8      * @return    The number of characters read
 9      */
10     
11     private LinkedList<Character> que = new LinkedList<Character>();
12     private boolean EOF = false;
13     public int read(char[] buf, int n) {
14         int readCount = 0;
15         
16         //先用queue中剩余的上次结果加到buf中
17         while(!que.isEmpty() && readCount < n){
18             buf[readCount++] = que.poll();
19         }
20         //若是不够再调用read4 API
21         while(!EOF && readCount < n){
22             char [] read4Buff = new char[4];
23             int read4Num = read4(read4Buff);
24             if(read4Num < 4){
25                 EOF = true;
26             }
27             int countToRead = Math.min(n-readCount, read4Num);
28             for(int i = 0; i<countToRead; i++){
29                 buf[readCount++] = read4Buff[i];
30             }
31             
32             while(countToRead < read4Num){ //把当前read4Buff中没有读的有用char加到queue中
33                 que.add(read4Buff[countToRead++]);
34             }
35         }
36         return readCount;
37     }
38 }

 

转载于:https://www.cnblogs.com/Dylan-Java-NYC/p/5321852.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值