Question

Formatted question description: https://leetcode.ca/all/157.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

Read every 4, and then judge the results,

  • If it is 0, it means that the buf has been read at this time, and the loop is jumped out, and the smaller value of res and n is directly returned.
  • Otherwise, keep reading until n characters are read, the loop ends, and finally the smaller value of res and n is returned

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/
    // 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
         */
        int read(char *buf, int n) {
            int cnt = 0;
            while (cnt < n) {
                int x = read4(buf + cnt);
                if (!x) break;
                cnt += x;
            }
            cnt = min(cnt, n);
            buf[cnt] = '\0';
            return cnt;
        }
    };
    
  • # The read4 API is already defined for you.
    # @param buf, a list of characters
    # @return an integer
    # def read4(buf):
    
    class Solution(object):
      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)
          if r == 0:
            break
          for i in range(min(r, n - cnt)):
            buf[cnt] = tmp[i]
            cnt += 1
        return cnt
    
    

All Problems

All Solutions