高级农民
- 积分
- 4143
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-1-22
- 最后登录
- 1970-1-1
|
157. Read N Characters Given Read4
Solved
Easy
Topics
conpanies icon
Companies
Given a file and assume that you can only read the file using a given method read4, implement a method to read n characters.
Method read4:
The API read4 reads four consecutive characters from file, then writes those characters into the buffer array buf4.
The return value is the number of actual characters read.
Note that read4() has its own file pointer, much like FILE *fp in C.
Definition of read4:
Parameter: char[] buf4
Returns: int
buf4[] is a destination, not a source. The results from read4 will be copied to buf4[].
Below is a high-level example of how read4 works:
File file("abcde"); // File is "abcde", initially file pointer (fp) points to 'a'
char[] buf4 = new char[4]; // Create buffer with enough space to store characters
read4(buf4); // read4 returns 4. Now buf4 = "abcd", fp points to 'e'
read4(buf4); // read4 returns 1. Now buf4 = "e", fp points to end of file
read4(buf4); // read4 returns 0. Now buf4 = "", fp points to end of file
Method read:
By using the read4 method, implement the method read that reads n characters from file and store it in the buffer array buf. Consider that you cannot manipulate file directly.
The return value is the number of actual characters read.
Definition of read:
Parameters: char[] buf, int n
Returns: int
buf[] is a destination, not a source. You will need to write the results to buf[].
Note:
Consider that you cannot manipulate the file directly. The file is only accessible for read4 but not for read.
The read function will only be called once for each test case.
You may assume the destination buffer array, buf, is guaranteed to have enough space for storing n characters.
Example 1:
Input: file = "abc", n = 4
Output: 3
Explanation: After calling your read method, buf should contain "abc". We read a total of 3 characters from the file, so return 3.
Note that "abc" is the file's content, not buf. buf is the destination buffer that you will have to write the results to.
Example 2:
Input: file = "abcde", n = 5
Output: 5
Explanation: After calling your read method, buf should contain "abcde". We read a total of 5 characters from the file, so return 5.
Example 3:
Input: file = "abcdABCD1234", n = 12
Output: 12
Explanation: After calling your read method, buf should contain "abcdABCD1234". We read a total of 12 characters from the file, so return 12.
Constraints:
1 <= file.length <= 500
file consist of English letters and digits.
1 <= n <= 1000- """
- The read4 API is already defined for you.
- @param buf4, a list of characters
- [url=home.php?mod=space&uid=160137]@return[/url] an integer
- def read4(buf4):
- # Below is an example of how the read4 API can be called.
- file = File("abcdefghijk") # File is "abcdefghijk", initially file pointer (fp) points to 'a'
- buf4 = [' '] * 4 # Create buffer with enough space to store characters
- read4(buf4) # read4 returns 4. Now buf = ['a','b','c','d'], fp points to 'e'
- read4(buf4) # read4 returns 4. Now buf = ['e','f','g','h'], fp points to 'i'
- read4(buf4) # read4 returns 3. Now buf = ['i','j','k',...], fp points to end of file
- """
- class Solution:
- def read(self, buf, n):
- """
- :type buf: Destination buffer (List[str])
- :type n: Number of characters to read (int)
- :rtype: The number of actual characters read (int)
- """
-
- # 已读入到 buf 的字符总数
- copied_chars = 0
- # 临时缓冲区,用于存放 read4 读取的 4 个字符
- buf4 = [''] * 4
-
- while copied_chars < n:
- # 1. 从文件读取数据到临时缓冲区
- count = read4(buf4)
-
- # 如果没读到数据,说明文件已经结束
- if count == 0:
- break
-
- # 2. 计算本次实际需要拷贝多少个字符
- # 剩余需要读取的字符数为 n - copied_chars
- # 我们只能从 count 和 剩余需求量 之间取最小值
- remaining_needed = n - copied_chars
- curr_copy_count = min(count, remaining_needed)
-
- # 3. 将数据从临时缓冲区 buf4 拷贝到目标缓冲区 buf
- for i in range(curr_copy_count):
- buf[copied_chars] = buf4[i]
- copied_chars += 1
-
- # 如果本次 read4 读到的字符少于 4 个,说明已经读到文件末尾了
- if count < 4:
- break
-
- return copied_chars
复制代码 |
|