王廷瑋|數位醫療|智慧醫療: 157. Read N Characters Given Read4 WFU

2024年7月8日 星期一

157. Read N Characters Given Read4

157. Read N Characters Given Read4


給定一個文件,假設你只能使用給定的方法 read4 來讀取文件,實現一個方法來讀取 n 個字符。

方法 read4:

API read4 從文件中讀取四個連續的字符,然後將這些字符寫入緩衝區數組 buf4。

返回值是實際讀取的字符數量。

注意,read4() 有它自己的文件指針,類似於 C 語言中的 FILE *fp。

read4 的定義:

參數:char[] buf4 返回值:int

buf4[] 是目標緩衝區,而不是來源。read4 的結果將被複製到 buf4[] 中。 以下是一個 read4 如何工作的高級示例:

文件 file("abcde"); // 文件內容是 "abcde",初始文件指針 (fp) 指向 'a' char[] buf4 = new char[4]; // 創建一個緩衝區,有足夠的空間存儲字符 read4(buf4); // read4 返回 4,現在 buf4 = "abcd",fp 指向 'e' read4(buf4); // read4 返回 1,現在 buf4 = "e",fp 指向文件末尾 read4(buf4); // read4 返回 0,現在 buf4 = "",fp 指向文件末尾

方法 read:

通過使用 read4 方法,實現 read 方法來從文件中讀取 n 個字符並將其存儲在緩衝區數組 buf 中。考慮到你不能直接操作文件。

返回值是實際讀取的字符數量。

read 的定義:

參數:char[] buf, int n 返回值:int

buf[] 是目標緩衝區,而不是來源。你需要將結果寫入 buf[] 中。 注意:

考慮到你不能直接操作文件。文件只能通過 read4 訪問,而不能通過 read 訪問。 每個測試用例只會調用一次 read 方法。 你可以假設目標緩衝區數組 buf 有足夠的空間來存儲 n 個字符。

範例 :

輸入: 文件 = "abc", n = 4 輸出: 3 解釋: 在調用你的 read 方法後,buf 應該包含 "abc"。我們總共從文件中讀取了 3 個字符,所以返回 3。 注意 "abc" 是文件的內容,而不是 buf。buf 是你必須將結果寫入的目標緩衝區。


Python


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)
"""
buf4 = [''] * 4
total_chars_read = 0
while total_chars_read < n:
chars_read = read4(buf4)
if chars_read == 0:
break
chars_to_copy = min(chars_read, n - total_chars_read)
for i in range(chars_to_copy):
buf[total_chars_read + i] = buf4[i]
total_chars_read += chars_to_copy
return total_chars_read

16.52MB, 43ms


C++


/**
* The read4 API is defined in the parent class Reader4.
* int read4(char *buf4);
*/

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) {
char buf4[4];
int totalCharsRead = 0;
while (totalCharsRead < n) {
int charsRead = read4(buf4);
if (charsRead == 0) {
break;
}
int charsToCopy = std::min(charsRead, n - totalCharsRead);
for (int i = 0; i < charsToCopy; ++i) {
buf[totalCharsRead + i] = buf4[i];
}
totalCharsRead += charsToCopy;
}
return totalCharsRead;
}
};

7.8MB, 3ms


Javascript


/**
* Definition for read4()
*
* @param {character[]} buf4 Destination buffer
* @return {number} The number of actual characters read
* read4 = function(buf4) {
* ...
* };
*/

/**
* @param {function} read4()
* @return {function}
*/
var solution = function(read4) {
/**
* @param {character[]} buf Destination buffer
* @param {number} n Number of characters to read
* @return {number} The number of actual characters read
*/
return function(buf, n) {
let totalCharsRead = 0;
let buf4 = new Array(4);
while (totalCharsRead < n) {
let charsRead = read4(buf4);
if (charsRead === 0) {
break;
}
let charsToCopy = Math.min(charsRead, n - totalCharsRead);
for (let i = 0; i < charsToCopy; i++) {
buf[totalCharsRead + i] = buf4[i];
}
totalCharsRead += charsToCopy;
}
return totalCharsRead;
};
};

48.00MB, 45ms