leetcode Read N Characters Given Read 4 I/II

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 will only be called once for each test case.

I比较简单,需要考虑两个边界值,一个是文件读完,即read4返回值小于4的情况,第二个是当n要读完而此时读到的char为read4中间值的时候,即我们不需要读取全部的read4字符就可以完成时,代码:

public int readI(char[] buf, int n) {
    for(int i=0;i<n;i+=4){
        char[] temp=new char[4];
        int len=read4(temp);
        System.arraycopy(temp,0,buf,i,Math.min(n-i,len));
        if(len<4) return Math.min(i+len,n);
    }
    return n;
}

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.

II相对复杂,举个例子,我们第一次调用read10,那么三次read4后剩余两个字符,此时这两个字符不能存到buf中,因此我们需要一个中间数组来存储这两个字符,第二次调用read1,我们取这中间数组中的一个字符即可,也就是当复制到buf中时,我们需要先判断中间数组是否为空,若不为空先取中间数组的字符,然后再像I一样调用read4,很显然,中间数组可以用一个先进先出的优先队列表示,代码:

private Queue<Character> queue=new LinkedList<>();
public int read(char[] buf, int n) {
    int m=0;
    while(m<n&&!queue.isEmpty()){
        buf[m++]=queue.poll();
    }
   for(int i=m;i<n;i+=4){
       char[] temp=new char[4];
       int len=read4(temp);
       if(len>n-i){
           System.arraycopy(temp,0,buf,i,n-i);
           int k=len-n+i;
           for(int index=k;index<len;index++)
               queue.offer(temp[index]);
       }
       else System.arraycopy(temp,0,buf,i,len);
       if(len<4) return Math.min(i+len,n);
   }
    return n;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值