Welcome to Subscribe On Youtube

Question

Formatted question description: https://leetcode.ca/all/158.html

 157	Read N Characters Given Read4

 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.

Algorithm

Two variables readPos and writePos are used to record the position of reading and writing, i starts looping from 0 to n,

  • If the read and write positions are the same at this time, call the read4 function, assign the result to writePos, and set readPos to zero,
  • If writePos is zero, indicating that there is nothing in buf, return the current coordinate i. Then use the readPos position of the built-in buff variable to overwrite the i position of the input string buf,
  • If the traversal is completed, return n

Code

Java

  • public class Read_N_Characters_Given_Read4 {
        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) {
                boolean isEof = false;
                int charsRead = 0;
                char[] buf4 = new char[4];
    
                while (!isEof && charsRead < n) {
                    int size = read4(buf4);
                    if (size < 4) {
                        isEof = true;
                    }
    
                    if (charsRead + size > n) {
                        size = n - charsRead;
                    }
    
                    /*
                            arraycopy(Object src,  int  srcPos,
                                      Object dest, int destPos,
                                      int length);
                     */
                    // if last iteration and size==0, then copy length==0, not over-copy
                    System.arraycopy(buf4, 0, buf, charsRead, size);
                    charsRead += size;
                }
    
                return charsRead;
            }
    
        }
    
        private class Reader4 {
            public int read4(char[] buf4) {
                return 1; // stub
            }
        }
    }
    
    
  • // OJ: https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/
    // Time: O(N)
    // Space: O(1)
    // Forward declaration of the read4 API.
    int read4(char *buf);
    class Solution {
    public:
        /**
         * @param buf Destination buffer
         * @param n   Number of characters to read
         * @return    The number of actual characters read
         */
        char leftover[4] = { '\0' };
        int read(char *buf, int n) {
            strcpy(buf, leftover);
            int cnt = strlen(leftover);
            while (cnt < n) {
                int x = read4(buf + cnt);
                if (!x) break;
                cnt += x;
            }
            if (cnt > n) {
                memcpy(leftover, buf + n, cnt - n);
                leftover[cnt - n] = '\0';
            } else leftover[0] = '\0';
            cnt = min(cnt, n);
            return cnt;
        }
    };
    
  • # The read4 API is already defined for you.
    # def read4(buf4: List[str]) -> int:
    
    
    class Solution:
        def __init__(self):
            self.buf4 = [None] * 4
            self.i = self.size = 0
    
        def read(self, buf: List[str], n: int) -> int:
            j = 0
            while j < n:
                if self.i == self.size:
                    self.size = read4(self.buf4)
                    self.i = 0
                    if self.size == 0:
                        break
                while j < n and self.i < self.size:
                    buf[j] = self.buf4[self.i]
                    self.i += 1
                    j += 1
            return j
    
    ############
    
    # The read4 API is already defined for you.
    # @param buf, a list of characters
    # @return an integer
    # def read4(buf):
    from collections import deque
    
    
    class Solution(object):
      def __init__(self):
        self.rBuf = deque([])
    
      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)
        """
        cnt = 0
        tmp = [""] * 4
        while cnt < n:
          r = read4(tmp)
          for i in range(r):
            self.rBuf.append(tmp[i])
          for i in range(min(n - cnt, len(self.rBuf))):
            buf[cnt] = self.rBuf.popleft()
            cnt += 1
          if r == 0:
            break
        return cnt
    
    

All Problems

All Solutions