谷歌(Google)历年编程真题——用 Read4 读取 N 个字符

2024-04-11 19:44

本文主要是介绍谷歌(Google)历年编程真题——用 Read4 读取 N 个字符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

谷歌历年面试真题——数组和字符串系列真题练习。

用 Read4 读取 N 个字符

给你一个文件,并且该文件只能通过给定的 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 个字符。

思路一:

可以利用循环调用 read4 方法来实现读取指定数量的字符。每次调用 read4 方法读取到的字符数可能少于 4,因此需要考虑不同情况下的处理方式。

具体步骤如下:

  1. 使用一个循环,每次调用 read4 方法读取字符到一个临时缓冲区中。
  2. 在循环中,将读取到的字符添加到目标缓存区 buf 中,同时更新目标缓存区的索引 buf_index
  3. 如果读取到的字符数小于 4,说明已经读取完文件,直接返回目标缓存区中的字符数即可。
  4. 如果目标缓存区 buf 已经存储了目标字符数 n,也直接返回目标缓存区中的字符数。

下面是相应的 Python 代码实现:

def read4(buf4):pass  # read4 函数的实现在题目中已经给出def read(buf, n):buf_index = 0while buf_index < n:# 使用 read4 方法读取字符到临时缓冲区 temp_buf 中temp_buf = [''] * 4count = read4(temp_buf)# 将读取到的字符添加到目标缓存区 buf 中for i in range(count):if buf_index < n:buf[buf_index] = temp_buf[i]buf_index += 1else:break# 如果读取到的字符数少于 4,说明已经读取完文件,直接返回目标缓存区中的字符数if count < 4:return buf_indexreturn buf_index# 示例测试
file1 = "abc"
buf1 = [''] * 4
print(read(buf1, 4))  # 输出:3,文件一共 3 个字符
print("".join(buf1[:3]))  # 输出:abcfile2 = "abcde"
buf2 = [''] * 5
print(read(buf2, 5))  # 输出:5,文件一共 5 个字符
print("".join(buf2[:5]))  # 输出:abcdefile3 = "abcdABCD1234"
buf3 = [''] * 12
print(read(buf3, 12))  # 输出:12,文件一共 12 个字符
print("".join(buf3[:12]))  # 输出:abcdABCD1234file4 = "leetcode"
buf4 = [''] * 5
print(read(buf4, 5))  # 输出:5,文件一共 5 个字符
print("".join(buf4[:5]))  # 输出:leetc

这样,通过不断调用 read4 方法,并将读取到的字符存储到目标缓存区 buf 中,直到达到指定的字符数 n 或者文件结束,就可以实现读取指定数量的字符。

思路二:

除了循环调用 read4 方法来读取字符外,还可以利用一个队列来缓存已读取的字符,从而避免多次调用 read4 方法。

具体步骤如下:

  1. 使用一个队列来缓存已读取的字符。
  2. read 方法中,先检查队列中是否还有字符未被消费,如果有,则从队列中取出字符填充到目标缓存区 buf 中。
  3. 如果队列中字符不足,则继续循环调用 read4 方法,将读取到的字符添加到队列中,直到队列中的字符足够填充到目标缓存区 buf 中或者文件结束。
  4. 返回实际读取的字符数,即目标缓存区中的字符数。

下面是相应的 Python 代码实现:

def read4(buf4):pass  # read4 函数的实现在题目中已经给出class Solution:def __init__(self):self.queue = []def read(self, buf, n):buf_index = 0# 先将队列中的字符填充到目标缓存区 buf 中while self.queue and buf_index < n:buf[buf_index] = self.queue.pop(0)buf_index += 1# 继续从文件中读取字符,直到填充到目标缓存区 buf 中或者文件结束while buf_index < n:temp_buf = [''] * 4count = read4(temp_buf)for i in range(count):if buf_index < n:buf[buf_index] = temp_buf[i]buf_index += 1else:# 如果读取到的字符数多于目标缓存区 buf 的大小,将多余的字符存入队列中self.queue.append(temp_buf[i])# 如果读取到的字符数少于 4,说明已经读取完文件,直接返回目标缓存区中的字符数if count < 4:breakreturn buf_index# 示例测试
file1 = "abc"
buf1 = [''] * 4
sol = Solution()
print(sol.read(buf1, 4))  # 输出:3,文件一共 3 个字符
print("".join(buf1[:3]))  # 输出:abcfile2 = "abcde"
buf2 = [''] * 5
print(sol.read(buf2, 5))  # 输出:5,文件一共 5 个字符
print("".join(buf2[:5]))  # 输出:abcdefile3 = "abcdABCD1234"
buf3 = [''] * 12
print(sol.read(buf3, 12))  # 输出:12,文件一共 12 个字符
print("".join(buf3[:12]))  # 输出:abcdABCD1234file4 = "leetcode"
buf4 = [''] * 5
print(sol.read(buf4, 5))  # 输出:5,文件一共 5 个字符
print("".join(buf4[:5]))  # 输出:leetc

通过使用队列来缓存已读取的字符,可以减少对 read4 方法的调用次数,从而提高效率。

这篇关于谷歌(Google)历年编程真题——用 Read4 读取 N 个字符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/895012

相关文章

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

16.Spring前世今生与Spring编程思想

1.1.课程目标 1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。 2、 了解Spring的发展历史,启发思维。 3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。 4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。 5、Spring编程思想总结。 1.2.内容定位 Spring使用经验

3月份目标——刷完乙级真题

https://www.patest.cn/contests/pat-b-practisePAT (Basic Level) Practice (中文) 标号标题通过提交通过率1001害死人不偿命的(3n+1)猜想 (15)31858792260.41002写出这个数 (20)21702664840.331003我要通过!(20)11071447060.251004成绩排名 (20)159644

IPython小白教程:提升你的Python交互式编程技巧,通俗易懂!

IPython是一个增强的Python交互式shell,它提供了丰富的功能和便捷的交互方式,使得Python开发和数据分析工作更加高效。本文将详细介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython由Fernando Pérez于2001年创建,旨在提供一个更高效的Python交互式编程环境。 2. IPyt

从《深入设计模式》一书中学到的编程智慧

软件设计原则   优秀设计的特征   在开始学习实际的模式前,让我们来看看软件架构的设计过程,了解一下需要达成目标与需要尽量避免的陷阱。 代码复用 无论是开发何种软件产品,成本和时间都最重要的两个维度。较短的开发时间意味着可比竞争对手更早进入市场; 较低的开发成本意味着能够留出更多营销资金,因此能更广泛地覆盖潜在客户。 代码复用是减少开发成本时最常用的方式之一。其意图

PHP 读取或生成大的Excel

场景,在很多情况下,需要读取Excel文件。 常用的有PHPExcel包或者使用 maatwebsite/excel 包 但是使用这个包读取或生成excel,如果excel文件过大,很容易出现超内存情况。 解决方法: 上传:要求上传者使用.csv 文件上传。然后使用php自带的 fgetcsv()函数来读取文件。http://php.net/manual/zh/function.fgetc

Java——IO流(一)-(5/8):IO流概述、字节流-FileInputStream 每次读取一个字节

IO流概述 介绍 输入输出流,用于读写数据。 I指Input,称为输入流:负责把数据读到内存中去。 O指Output,称为输出流:负责写数据出去。 IO流的应用场景 文件内容的读写永久保存应用数据复制粘贴对话通信等等 怎么学IO流 理清楚IO六点分类和体系循序渐进、深入学习每个IO流的作用和用法 IO流的分类 IO流总体来看就有四大类: 字节输入流:以内存

Java并发编程—阻塞队列源码分析

在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。   在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了D