package com.interview.misc;
import java.util.Arrays;
/**
* Date 03/26/2016
* @author Tushar Roy
*
* Given a reader which only reads 4 bytes implement a Reader which can read bytes of give size.
*
* Reference
* Read N Characters Given Read4 II
* https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/
*/
class Read4 {
int read4(char[] buff) {
buff[0] = 'a';
buff[1] = 'b';
buff[2] = 'c';
buff[3] = 'd';
return 4;
}
}
public class Read4Function extends Read4{
class Queue {
int start;
int end;
int count;
char[] data;
int size;
Queue(int size) {
data = new char[size];
this.size = size;
}
boolean isEmpty() {
return count == 0;
}
void offer(char b) {
data[start] = b;
start = (start + 1)%size;
count++;
}
char poll() {
char d = data[end];
end = (end + 1)%size;
count--;
return d;
}
}
private final Queue queue;
public Read4Function() {
queue = new Queue(4);
}
public int read(char[] buf, int n) {
int r = 0;
while (!queue.isEmpty() && r < n) {
buf[r++] = queue.poll();
}
if (r == n) {
return r;
}
int index = 0;
int readSize = 0;
char[] input = null;
do {
input = new char[4];
readSize = read4(input);
index = 0;
while(r < n && index < readSize) {
buf[r++] = input[index++];
}
} while (readSize == 4 && r < n);
while (index < readSize) {
queue.offer(input[index++]);
}
return r;
}
public static void main(String args[]) {
Read4Function rf = new Read4Function();
char[] buff = new char[10];
int size = rf.read(buff, 2);
System.out.print(size);
System.out.println(Arrays.toString(buff));
size = rf.read(buff, 1);
System.out.print(size);
System.out.println(Arrays.toString(buff));
size = rf.read(buff, 1);
System.out.print(size);
System.out.println(Arrays.toString(buff));
}
}