157. Read N Characters Given Read4 最长有效括号
难度: Easy
刷题内容
原题连接
- https://leetcode.com/problems/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.
Example 1:
Input: buf = "abc", n = 4
Output: "abc"
Explanation: The actual number of characters read is 3, which is "abc".
Example 2:
Input: buf = "abcde", n = 5
Output: "abcde"
Note:
The read function will only be called once for each test case.
解题方案
思路 1
讨论区有很多人说这道题很sb,给的例子和代码里面的input数据类型不一样,其实我也很懵逼 然后我看到了这个解释,顿悟
It took me several hours to understand what the problem is talking about.
Let's look at the very first sentence of the description, "The API: int read4(char *buf) reads 4 characters at a time from a file." I though this function read a file, which is represented by *buf. But I was wrong. The correct understanding should be like this: this function reads a file, and writes the first 4 characters to *buf, and if there are less than 4 characters to be read, then only the valid number of characters will be read and written to *buf.
Similarly, the function to be implemented, int read(char buf, int n) that reads n characters from the file, means n characters should be written to *buf.
Also the examples are very misleading. Let's say example 1,
Input: buf = "abc", n = 4
Output: "abc"
Explanation: The actual number of characters read is 3, which is "abc".
The input *buf is not "abc". The file to be read is "abc". The input, *buf , should be where the characters are written to. The output, is not the return value of read(buf, 4), but should be the actual characters in *buf after the function is called. And the return value should be an int, which is 3.
Hope this clarification helps :)
总结一下,就是read4(*read4_buf)
这个函数的意思就是从文件当中读4个字符并将其写入到read4_buf中去,返回值是实际读取到的字符个数,即如果文件中只剩3个(不到4个字符了)
,那么就只写3个字符到read4_buf中去,返回值是3
所以我们要实现的read(*buf)函数也是这样,我们要读取n个字符并写入到buf中去并且返回实际读取到的字符个数,如果不够我们就有多少写多少,然后返回实际写入的个数
那么现在我们有两种情况:
- n大于文件中的字符数,我们检测文件结束并停止读取并返回文件中的字符数。
- n小于或等于文件中的字符数,当读取足够的字符时返回(即n)
代码中用eof代表'end of file'
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)
"""
if n == 0 :
return 0
total_read, eof = 0, False
while not eof:
read4_buf = [''] * 4
cur_read = read4(read4_buf)
if (cur_read < 4):
eof = True
for i in range(cur_read):
buf[total_read] = read4_buf[i]
total_read += 1
if total_read == n:
return total_read
return total_read