王廷瑋|數位醫療|智慧醫療: 158. Read N Characters Given read4 II - Call Multiple Times WFU

2024年7月8日 星期一

158. Read N Characters Given read4 II - Call Multiple Times

158. Read N Characters Given read4 II - Call Multiple Times


給定一個文件,假設你只能使用給定的方法 read4 來讀取文件,實現一個方法 read 來讀取 n 個字符。你的 read 方法可能會被多次調用。
方法 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 方法可能會被多次調用。
請記住重置在 Solution 中聲明的類變量,因為靜態/類變量會在多個測試用例中持久存在。
你可以假設目標緩衝區數組 buf 有足夠的空間來存儲 n 個字符。
保證在給定的測試用例中,相同的緩衝區 buf 會被 read 調用。

範例 1:

輸入: 文件 = "abc", 查詢 = [1,2,1]
輸出: [1,2,0]

解釋: 測試用例表示以下情景: 文件 file("abc");
Solution sol;
sol.read(buf, 1); // 在調用你的 read 方法後,buf 應包含 "a"。我們從文件中總共讀取了 1 個字符,所以返回 1。
sol.read(buf, 2); // 現在 buf 應包含 "bc"。我們從文件中總共讀取了 2 個字符,所以返回 2。
sol.read(buf, 1); // 我們已經到達文件末尾,無法再讀取更多字符。所以返回 0。

假設 buf 已經分配並且有足夠的空間來存儲文件中的所有字符。


Python


# The read4 API is already defined for you.
# def read4(buf4: List[str]) -> int:

class Solution:
def __init__(self):
self.buffer = [''] * 4
self.buffer_pointer = 0
self.buffer_count = 0

def read(self, buf: List[str], n: int) -> int:
total_chars_read = 0
while total_chars_read < n:
if self.buffer_pointer == 0:
self.buffer_count = read4(self.buffer)
if self.buffer_count == 0:
break
while total_chars_read < n and self.buffer_pointer < self.buffer_count:
buf[total_chars_read] = self.buffer[self.buffer_pointer]
total_chars_read += 1
self.buffer_pointer += 1
if self.buffer_pointer == self.buffer_count:
self.buffer_pointer = 0
return total_chars_read

16.59MB, 26ms


C++


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

class Solution {
private:
char buffer[4]; // Buffer to store characters read by read4
int bufferPtr = 0; // Pointer to track the current position in the buffer
int bufferCount = 0; // Number of characters in the buffer

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 totalCharsRead = 0;
while (totalCharsRead < n) {
if (bufferPtr == 0) {
bufferCount = read4(buffer);
}
if (bufferCount == 0) {
break; // No more characters to read
}
while (totalCharsRead < n && bufferPtr < bufferCount) {
buf[totalCharsRead++] = buffer[bufferPtr++];
}
if (bufferPtr == bufferCount) {
bufferPtr = 0; // Reset the buffer pointer
}
}
return totalCharsRead;
}
};

7.90MB, 0ms


Javascript


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

/**
* @param {function} read4()
* @return {function}
*/
var solution = function(read4) {
let buffer = []; // Buffer to store characters read by read4
let bufferPtr = 0; // Pointer to track the current position in the buffer
let bufferCount = 0; // Number of characters in the buffer

/**
* @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;
while (totalCharsRead < n) {
if (bufferPtr === bufferCount) {
bufferCount = read4(buffer);
bufferPtr = 0;
}
if (bufferCount === 0) {
break; // No more characters to read
}
while (totalCharsRead < n && bufferPtr < bufferCount) {
buf[totalCharsRead++] = buffer[bufferPtr++];
}
}
return totalCharsRead;
};
};

49.14MB, 63ms