题目来源
题目描述

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;
}
};
本文解析了LeetCode题目158的升级版,涉及如何在read函数中多次调用read4读取字符,通过readPos和writePos跟踪读写位置,确保按需读取。核心思路是利用缓冲区和状态管理实现高效字符读取。
&spm=1001.2101.3001.5002&articleId=126475270&d=1&t=3&u=4c8bf0b3b0e440b0b5f61998024554a2)
419

被折叠的 条评论
为什么被折叠?



