【Lintcode】660. Read N Characters Given Read4 II - Call Multiple Times

题目地址:

https://www.lintcode.com/problem/read-n-characters-given-read4-ii-call-multiple-times/description

给定一个接口int read4(char * buf)可以每次从文件中读取 4 4 4个字符,返回值是实际读取的字符数(有可能文件剩下的字符数不够,从而返回小于 4 4 4的数字)。要求通过这个接口,实现从文件读取 n n n个字符的函数,返回值也是实际读取的字符数。这个函数会调用多次。

思路是利用队列。开个长度为 4 4 4的小数组,然后用两个指针分别指向队列头和队列尾(就是队列所含的最后一个元素的后一位的位置),接下来每次读 n n n个字符的时候,执行下面操作:
1、只要还没读够 n n n个字符,则进行循环;
2、如果队列空,那么调用read4,将队列尾指针指向该函数返回值 x x x(表示读了 x x x个字符了,尾指针指向其后的位置);
3、如果 x x x 0 0 0,说明已经没有字符可以读了,退出循环;
4、否则说明还有字符可以读,只要当没读够 n n n个字符并且队列里还有字符的时候,进行读取,并同时记录读了多少个字符。

最后返回读了多少个字符即可。代码如下:

public class Solution extends Reader4 {
     
    
    private char[] buffer = new char[4];
    private int head, tail;
    
    /**
     * @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) {
     
        // Write your code here
        // res记录本次读取多少个字符
        int res = 0;
        
        // 只要没读够n个字符就循环
        while (res < n) {
     
        	// 如果队列空,则进行读取,并重置头指针为0
            if (head == tail) {
     
                head = 0;
                tail = read4(buffer);
            }
            
            // 如果没读到任何字符,则退出循环
            if (tail == 0) {
     
                break;
            }
            
            // 否则只要没读够n个字符,并且队列不空,就进行读取,并赋值给buf数组
            while (res < n && head < tail) {
     
                buf[res++] = buffer[head++];
            }
        }
        
        return res;
    }
}

class Reader4 {
     
    int read4(char[] buf) {
     
        return 0;
    }
}

时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)

你可能感兴趣的:(LC,栈,队列,串及其他数据结构,队列,指针,java,数据结构)