题目来源
题目描述
int read4(char *buf);
class Solution {
public:
int read(char *buf, int n) {
}
};
题目解析
题意
和158不同的是,read要调用多次。
举个例子:
buf = “ab”, [read(1),read(2)],返回 [“a”,“b”]
那么第一次调用 read(1) 后,从 buf 中读出一个字符,就是第一个字符a,然后又调用了一个 read(2),想取出两个字符,但是 buf 中只剩一个b了,所以就把取出的结果就是b。
再举个例子:
buf = “a”, [read(0),read(1),read(2)],返回 [“”,“a”,“”]
第一次调用 read(0),不取任何字符,返回空,第二次调用 read(1),取一个字符,buf 中只有一个字符,取出为a,然后再调用 read(2),想取出两个字符,但是 buf 中没有字符了,所以取出为空。
思路
用两个变量 readPos 和 writePos 来记录读取和写的位置,i从0到n开始循环,如果此时读和写的位置相同,那么调用 read4 函数,将结果赋给 writePos,把 readPos 置零,如果 writePos 为零的话,说明 buf 中没有东西了,返回当前的坐标i。然后用内置的 buff 变量的 readPos 位置覆盖输入字符串 buf 的i位置,如果完成遍历,返回n
class Solution {
int readPos = 0, writePos = 0;
char buff[4];
public:
int read(char *buf, int n) {
for (int i = 0; i < n; ++i) {
if(readPos == writePos){
writePos = read4(buf);
readPos = 0;
if(writePos == 0){
return i;
}
}
buf[i] = buf[readPos++];
}
return n;
}
};