LeetCode 题解(234) : 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 readsn characters from the file.

Note:
The read function may be called multiple times.

题解:

需要用Queue保存之前多读的character。每次读时,先看Queue里的够不够,如果不够,先读到够为止。

C++版:

// 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
     */
    int read(char *buf, int n) {
        if(n == 0)
            return 0;
            
        int total = 0;
        while(this->buffer.size() < n && !this->endOfFile) {
            char* temp = new char[4];
            int r = read4(temp);
            if(r < 4)
                this->endOfFile = true;
            for(int i = 0; i < r; i++)
                this->buffer.push(temp[i]);
        }

        int l = min((int)this->buffer.size(), n);
        for(int i = 0; i < l; i++) {
            buf[i] = this->buffer.front();
            this->buffer.pop();
            total++;
        }
        return total;
    }
    
private:
    queue<char> buffer;
    bool endOfFile = false;
};

Java版:

/* The read4 API is defined in the parent class Reader4.
      int read4(char[] buf); */

public class Solution extends Reader4 {
    /**
     * @param buf Destination buffer
     * @param n   Maximum number of characters to read
     * @return    The number of characters read
     */
    public int read(char[] buf, int n) {
        if(n == 0)
            return 0;
            
        int total = 0;
        while(this.buffer.size() < n && !this.endOfFile) {
            char[] temp = new char[4];
            int r = read4(temp);
            if(r < 4)
                this.endOfFile = true;
            for(int i = 0; i < r; i++)
                this.buffer.add(temp[i]);
        }
        
        int l = Math.min(this.buffer.size(), n);
        for(int i = 0 ; i < l; i++) {
            buf[i] = this.buffer.poll();
            total++;
        }
        return total;
    }
    
    private boolean endOfFile = false;
    private Queue<Character> buffer = new LinkedList<>();
}

Python版:

# The read4 API is already defined for you.
# @param buf, a list of characters
# @return an integer
# def read4(buf):
from Queue import Queue

class Solution(object):
    def __init__(self):
        #self.curTotal = 0
        self.buffer = Queue()
        self.endOfFile = False
    def read(self, buf, n):
        """
        :type buf: Destination buffer (List[str])
        :type n: Maximum number of characters to read (int)
        :rtype: The number of characters read (int)
        """
        if n == 0:
            return 0
        
        total = 0
        while self.buffer.qsize() < n and not self.endOfFile:
            temp = [""] * 4
            r = read4(temp)
            if r < 4:
                self.endOfFile = True
            for i in range(r):
                self.buffer.put(temp[i])
            
        for i in range(min(self.buffer.qsize(), n)):
            buf[i] = self.buffer.get()
            total += 1
        
        return total

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值