157:用 Read4 读取 N 个字符

This commit is contained in:
轩辕龙儿 2022-03-19 21:22:50 +08:00
parent efcd1236a5
commit fa5083de29
2 changed files with 203 additions and 0 deletions

View File

@ -0,0 +1,122 @@
//给你一个文件并且该文件只能通过给定的 read4 方法来读取请实现一个方法使其能够读取 n 个字符
//
// read4 方法
//
// API read4 可以从文件中读取 4 个连续的字符并且将它们写入缓存数组 buf
//
// 返回值为实际读取的字符个数
//
// 注意 read4() 自身拥有文件指针很类似于 C 语言中的 FILE *fp
//
// read4 的定义
//
// 参数类型: char[] buf4
//返回类型: int
//
//注意: buf4[] 是目标缓存区不是源缓存区read4 的返回结果将会复制到 buf4[] 当中
//
//
// 下列是一些使用 read4 的例子
//
//
//
// File 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现在 buf = ""fp 指向文件末尾
//
// read 方法
//
// 通过使用 read4 方法实现 read 方法该方法可以从文件中读取 n 个字符并将其存储到缓存数组 buf 不能 直接操作文件
//
// 返回值为实际读取的字符
//
// read 的定义
//
// 参数类型: char[] buf, int n
//返回类型: int
//
//注意: buf[] 是目标缓存区不是源缓存区你需要将结果写入 buf[]
//
//
//
//
// 示例 1
//
// 输入 file = "abc", n = 4
//输出 3
//解释 当执行你的 read 方法后buf 需要包含 "abc" 文件一共 3 个字符因此返回 3 注意 "abc" 是文件的内容不是 buf
//内容buf 是你需要写入结果的目标缓存区
//
// 示例 2
//
// 输入 file = "abcde", n = 5
//输出 5
//解释 当执行你的 read 方法后buf 需要包含 "abcde"文件共 5 个字符因此返回 5
//
//
// 示例 3:
//
// 输入 file = "abcdABCD1234", n = 12
//输出 12
//解释 当执行你的 read 方法后buf 需要包含 "abcdABCD1234"文件一共 12 个字符因此返回 12
//
//
// 示例 4:
//
// 输入 file = "leetcode", n = 5
//输出 5
//解释 当执行你的 read 方法后buf 需要包含 "leetc"文件中一共 5 个字符因此返回 5
//
//
//
//
// 提示
//
//
// 不能 直接操作该文件文件只能通过 read4 获取而 不能 通过 read
// read 函数只在每个测试用例调用一次
// 你可以假定目标缓存数组 buf 保证有足够的空间存下 n 个字符
//
// Related Topics 字符串 交互 模拟 👍 46 👎 0
package leetcode.editor.cn;
//157: Read4 读取 N 个字符
public class ReadNCharactersGivenRead4 {
public static void main(String[] args) {
Solution solution = new ReadNCharactersGivenRead4().new Solution();
}
//leetcode submit region begin(Prohibit modification and deletion)
/**
* The read4 API is defined in the parent class Reader4.
* int read4(char[] buf4);
*/
public class Solution extends Reader4 {
/**
* @param buf Destination buffer
* @param n Number of characters to read
* @return The number of actual characters read
*/
public int read(char[] buf, int n) {
int index = 0;
char[] buf4 = new char[4];
int size = read4(buf4);
while (size > 0 && index < n) {
for (int i = 0; i < size && index < n; i++) {
buf[index] = buf4[i];
index++;
}
size = read4(buf4);
}
return index;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,81 @@
<p>给你一个文件,并且该文件只能通过给定的&nbsp;<code>read4</code>&nbsp;方法来读取,请实现一个方法使其能够读取 n 个字符。</p>
<p><strong>read4 方法:</strong></p>
<p>API&nbsp;<code>read4</code>&nbsp;可以从文件中读取 4 个连续的字符,并且将它们写入缓存数组&nbsp;<code>buf</code>&nbsp;中。</p>
<p>返回值为实际读取的字符个数。</p>
<p>注意&nbsp;<code>read4()</code> 自身拥有文件指针,很类似于 C 语言中的 <code>FILE *fp</code></p>
<p><strong>read4 的定义:</strong></p>
<pre>参数类型: char[] buf4
返回类型: int
注意: buf4[] 是目标缓存区不是源缓存区read4 的返回结果将会复制到 buf4[] 当中。
</pre>
<p>下列是一些使用 <code>read4</code> 的例子:</p>
<p><img style="width: 600px;"></p>
<pre><code>File file(&quot;abcde&quot;); // 文件名为 &quot;abcde&quot; 初始文件指针 (fp) 指向 &#39;a&#39;
char[] buf4 = new char[4]; // 创建一个缓存区使其能容纳足够的字符
read4(buf4); // read4 返回 4。现在 buf4 = &quot;abcd&quot;fp 指向 &#39;e&#39;
read4(buf4); // read4 返回 1。现在 buf4 = &quot;e&quot;fp 指向文件末尾
read4(buf4); // read4 返回 0。现在 buf = &quot;&quot;fp 指向文件末尾</code></pre>
<p><strong>read 方法:</strong></p>
<p>通过使用 <code>read4</code> 方法,实现&nbsp;<code>read</code> 方法。该方法可以从文件中读取 n 个字符并将其存储到缓存数组&nbsp;<code>buf</code> 中。您&nbsp;<strong>不能&nbsp;</strong>直接操作文件。</p>
<p>返回值为实际读取的字符。</p>
<p><strong>read&nbsp;的定义:</strong></p>
<pre>参数类型: char[] buf, int n
返回类型: int
注意: buf[] 是目标缓存区不是源缓存区,你需要将结果写入 buf[] 中。
</pre>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入: </strong>file = &quot;abc&quot;, n = 4
<strong>输出: </strong>3
<strong>解释:</strong> 当执行你的 read 方法后buf 需要包含 &quot;abc&quot;。 文件一共 3 个字符,因此返回 3。 注意 &quot;abc&quot; 是文件的内容,不是 buf 的内容buf 是你需要写入结果的目标缓存区。 </pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入: </strong>file = &quot;abcde&quot;, n = 5
<strong>输出: </strong>5
<strong>解释: </strong>当执行你的 read 方法后buf 需要包含 &quot;abcde&quot;。文件共 5 个字符,因此返回 5。
</pre>
<p><strong>示例 3:</strong></p>
<pre><strong>输入: </strong>file = &quot;abcdABCD1234&quot;, n = 12
<strong>输出: </strong>12
<strong>解释: </strong>当执行你的 read 方法后buf 需要包含 &quot;abcdABCD1234&quot;。文件一共 12 个字符,因此返回 12。
</pre>
<p><strong>示例 4:</strong></p>
<pre><strong>输入: </strong>file = &quot;leetcode&quot;, n = 5
<strong>输出: </strong>5
<strong>解释:</strong> 当执行你的 read 方法后buf 需要包含 &quot;leetc&quot;。文件中一共 5 个字符,因此返回 5。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><strong>不能</strong> 直接操作该文件,文件只能通过 <code>read4</code> 获取而 <strong>不能</strong> 通过 <code>read</code></li>
<li><code>read</code>&nbsp; 函数只在每个测试用例调用一次。</li>
<li>你可以假定目标缓存数组&nbsp;<code>buf</code> 保证有足够的空间存下 n 个字符。&nbsp;</li>
</ul>
<div><div>Related Topics</div><div><li>字符串</li><li>交互</li><li>模拟</li></div></div><br><div><li>👍 46</li><li>👎 0</li></div>