zoukankan      html  css  js  c++  java
  • [LeetCode#157] Read N Characters Given Read4

    Problem:

    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.

    Analysis:

    This problem is not hard, but it is easy to be wrong. 
    General Idea:
    Since read4(char[] buf) would always filled buf with four characters, no matter how many characters left in the file.
    case: read4(char[] buf) may fill buf with "['a', 'b', x00, x00]", if there are only two characters left in the file.
    
    Thus we could not directly use "read4" over "char[] buf", and we should take advantage of a temp_buffer for this purpose. Thus we could base on the return int of "read 4" to add the character into buf. 
    
    There are possible two situation of the end:
    1. there are not enough characters left in the file. (for the target n) 
    2. n was meeted. 
    
    For this condition, we should maintain a count of copied words.
    if (cur_len < 4 || count == n)
        break;
    
    When we copy the characters from the temp_buffer, we should only copy the valid range.
    1. the actual words we have read (may less than 4)
    2. iff we have already reach the target n. (may just need part of the characters)
    read_len = read4(temp_buffer);
    cur_len = Math.min(read_len, n - count);
    
    Then we should copy those characters into buf. 
    for (int i = 0; i < cur_len; i++)
        buf[count+i] = temp_buffer[i];
    Note: the cur_len's computation is very important along the process!!!

    Solution:

    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) {
            if (buf == null)
                throw new IllegalArgumentException("buf is null");
            if (n <= 0)
                return 0;
            int count = 0, read_len = 0, cur_len = 0;
            char[] temp_buffer = new char[4];
            while (true) {
                read_len = read4(temp_buffer);
                cur_len = Math.min(read_len, n - count);
                for (int i = 0; i < cur_len; i++)
                    buf[count+i] = temp_buffer[i];
                count += cur_len;
                if (cur_len < 4 || count == n)
                    break;
            }
            return count;
        }
    }
  • 相关阅读:
    在linux中连接wifi
    解决Chrome插件安装时出现的“程序包无效”问题
    全网最简单明了的MySQL连接Eclipse方法(JDBC详细安装方式及简单操作)2020新版
    机器学习--机器学习的分类
    背英语单词很困难,不妨学习一下词根词缀吧(每天10个词根、词缀)Part 3
    C++课程设计详解-12306的模拟实现
    C++课程设计,12306模拟写起来就是这么粗暴
    计算机组成原理--储存器概述
    JAVA I/O 与装饰者模式UML图
    PAT-字符串处理-B 1024 科学计数法 (20分)
  • 原文地址:https://www.cnblogs.com/airwindow/p/4811922.html
Copyright © 2011-2022 走看看