题目描述
给定API:int read4(char *buf)
从文件中读取4个字符。
返回值是实际读到的字符数量。例如,如果返回3,则说明文件中只有3个字符。
请使用read4
API实现一个新的函数:int read(char *buf, int n)
从文件中读取 $n$ 个字符。
样例1
输入:buf = "abc", n = 4
输出:"abc"
解释:实际读到了3个字符,是"abc"。
样例2
输入:buf = "abcde", n = 5
输出:"abcde"
算法
(模拟) $O(n)$
每次读取4个字符,直到读满 $n$ 个字符,或者读到文件结束为止(文件结束的标志是read4
读到的字符数量小于4)。
注意: 为了防止缓冲区溢出,我们需要定义一个临时数组,用来存储read4
读到的字符串。
时间复杂度分析:最多读 $n+3$ 个字符,所以时间复杂度是 $O(n)$。
C++ 代码
// Forward declaration of the read4 API.
int read4(char *buf);
class Solution {
public:
/**
* @param buf Destination buffer
* @param n Maximum number of characters to read
* @return The number of characters read
*/
int read(char *buf, int n) {
int s = 0;
char *p = buf, temp[4];
while (s < n)
{
int t = read4(temp);
for (int i = 0; i < t && s < n; i ++ )
{
*p ++ = temp[i];
s ++;
}
if (t < 4) break;
}
return s;
}
};
另外,不太理解char *p = buf 的用意,不define p,后面的p 都用buf,发现也是可以跑的
个人习惯hh
我习惯用
*p
来遍历字符串,就像用i
当数组下标一样。hi,谢谢群主的答案,想问一下,最后,buf[s] = 0 ,是在做什么呢,谢谢
因为在C/C++里,
char[]
表示的字符串要以’\0’截止,所以就习惯性的加上了。这题是让我们读入若干字符,不是读入一个字符串,所以那句话应该去掉,已去~