边工作边刷题:70天一遍leetcode: day 73
Read N Characters Given Read4 I/II
要点:这题的要点就是搞清楚几个变量的内在逻辑:只有buffer是整4 bytes的。而client要读的bytes(需求)和实际上disk上有的bytes(供给)都是不整的。所以,
- 循环的条件就是either 供给不足 or 需求不足:供给不足的判定是上一轮数据不够4 bytes的mark,而需求不足是toRead的计数<=0
- 所以循环体内,就是min(读进来的bytes, toRead)来把数据copy到buffer里,同时更新toRead和结束条件
- II就是加了个buffer来存上一轮的leftover和offset,在下一次读的时候,把剩余数据假装作为一个read4来处理。
- 为什么要用bufSize而不是offset本身?offset表示的是数据的起始位置(当前位置是还没读的),可能有数据,也可能没有。
- 所以逻辑是只有bufSize==0才读4 bytes,global buffer做缓冲区,而bufSize永远标示待读区间的大小
- offset不断从0向右,然后再回到0:4 bytes肯定一次读进来
I: https://repl.it/Cjjw/1
II: https://repl.it/CjkR/2
错误点:
- self.offset>=4,不是>4
- 别忘了eof(在bufsize==0里面)
# The API: int read4(char *buf) reads 4 characters at a time from a file.
# The return value is the actual number of characters read. For example, it returns 3 if there is only 3 characters left in the file.
# By using the read4 API, implement the function int read(char *buf, int n) that reads n characters from the file.
# Note:
# The read function will only be called once for each test case.
# Hide Company Tags Facebook
# Hide Tags String
# Hide Similar Problems (H) Read N Characters Given Read4 II - Call multiple times
# The read4 API is already defined for you.
# @param buf, a list of characters
# @return an integer
# def read4(buf):
class Solution(object):
def read(self, buf, n):
"""
:type buf: Destination buffer (List[str])
:type n: Maximum number of characters to read (int)
:rtype: The number of characters read (int)
"""
eof, nbytes = False, 0
while not eof and nbytes<n:
buf4 = [""]*4
nread = read4(buf4)
if nread<4:
eof = True
nnext = min(nread, n-nbytes)
for i in xrange(nnext):
buf[nbytes+i]=buf4[i]
nbytes+=nnext
return nbytes
# The API: int read4(char *buf) reads 4 characters at a time from a file.
# The return value is the actual number of characters read. For example, it returns 3 if there is only 3 characters left in the file.
# By using the read4 API, implement the function int read(char *buf, int n) that reads n characters from the file.
# Note:
# The read function may be called multiple times.
# Hide Company Tags Bloomberg Google Facebook
# Hide Tags String
# Hide Similar Problems (E) Read N Characters Given Read4
# The read4 API is already defined for you.
# @param buf, a list of characters
# @return an integer
# def read4(buf):
class Solution(object):
def __init__(self):
self.bufbytes, self.offset = 0,0
self.buf4 = [""]*4
def read(self, buf, n):
"""
:type buf: Destination buffer (List[str])
:type n: Maximum number of characters to read (int)
:rtype: The number of characters read (int)
"""
eof, nbytes = False, 0
while not eof and nbytes<n:
if self.bufbytes==0:
self.bufbytes = read4(self.buf4)
if self.bufbytes<4: # error: don't forget
eof = True
toread = min(n-nbytes, self.bufbytes)
#print toread,self.offset
for i in xrange(toread):
buf[nbytes+i]=self.buf4[self.offset+i]
self.offset+=toread
if self.offset >= 4: # error: >=4, last index is 3
self.offset-=4
self.bufbytes-=toread
nbytes+=toread
return nbytes
边工作边刷题:70天一遍leetcode: day 73的更多相关文章
- 边工作边刷题:70天一遍leetcode: day 89
Word Break I/II 现在看都是小case题了,一遍过了.注意这题不是np complete,dp解的time complexity可以是O(n^2) or O(nm) (取决于inner ...
- 边工作边刷题:70天一遍leetcode: day 77
Paint House I/II 要点:这题要区分房子编号i和颜色编号k:目标是某个颜色,所以min的list是上一个房子编号中所有其他颜色+当前颜色的cost https://repl.it/Chw ...
- 边工作边刷题:70天一遍leetcode: day 78
Graph Valid Tree 要点:本身题不难,关键是这题涉及几道关联题目,要清楚之间的差别和关联才能解类似题:isTree就比isCycle多了检查连通性,所以这一系列题从结构上分以下三部分 g ...
- 边工作边刷题:70天一遍leetcode: day 85-3
Zigzag Iterator 要点: 实际不是zigzag而是纵向访问 这题可以扩展到k个list,也可以扩展到只给iterator而不给list.结构上没什么区别,iterator的hasNext ...
- 边工作边刷题:70天一遍leetcode: day 101
dp/recursion的方式和是不是game无关,和game本身的规则有关:flip game不累加值,只需要一个boolean就可以.coin in a line II是从一个方向上选取,所以1d ...
- 边工作边刷题:70天一遍leetcode: day 1
(今日完成:Two Sum, Add Two Numbers, Longest Substring Without Repeating Characters, Median of Two Sorted ...
- 边工作边刷题:70天一遍leetcode: day 70
Design Phone Directory 要点:坑爹的一题,扩展的话类似LRU,但是本题的accept解直接一个set搞定 https://repl.it/Cu0j # Design a Phon ...
- 边工作边刷题:70天一遍leetcode: day 71-3
Two Sum I/II/III 要点:都是简单题,III就要注意如果value-num==num的情况,所以要count,并且count>1 https://repl.it/CrZG 错误点: ...
- 边工作边刷题:70天一遍leetcode: day 71-2
One Edit Distance 要点:有两种解法要考虑:已知长度和未知长度(比如只给个iterator) 已知长度:最好不要用if/else在最外面分情况,而是loop在外,用err记录misma ...
随机推荐
- [PE结构分析] 6.IMAGE_SECTION_HEADER
IMAGE_SECTION_HEADER 的源代码如下: typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAM ...
- eclipse easyexplorer openexplorer
电脑重装了.. eclipse换成了4.4.2,发现原来的easyexplorer不生效了(原来是4.2),搜了下,换成了open explorer即可. 方式一样,都是丢到eclipse/plugi ...
- [js开源组件开发]js文本框计数组件
js文本框计数组件 先上效果图: 样式可以自行调整 ,它的功能提供文本框的实时计数,并作出对应的操作,比如现在超出了,点击下面的按钮后,文本框会闪动两下,阻止提交.具体例子可以点击demo:http: ...
- [原创]html5_PC游戏_图片俄罗斯方块
PC游戏_图片俄罗斯方块 以前的了,快一年了... 使用了离线canvas复制的方法,启动预览效果需要服务器支持 另外,AC娘图片可以自己做加载功能,这样游戏图片显示更顺畅 效果: --- 代码: h ...
- JS之跨域
今天学了跨域,迫不及待想跟大家分享!不妥之处希望大家指正. 首先来明确一下"跨域"这个概念. 跨域指的是,到外域去取数据.那什么是"外域"呢?我们先来了解同域. ...
- 被混淆的C#类库的反编译
今天看公司以前的代码,用的是.NRT Reactor v4.4.7.5进行的混淆,直接使用.NET Reflector v8.5.0.179 是无法查看的,提示:Invalid number of d ...
- JSP利用freemarker生成基于word模板的word文档
利用freemarker生成基于word模板的word文档 freemarker简介 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器 ...
- 使用SharedPreferences进行简单的储存
博客地址 http://www.cnblogs.com/mmyblogs/p/6082512.html(转载请保留) SharedPreferences定义 1.是一种轻型的数据存储的方式 2.本质是 ...
- Java从零开始学四十七(注解简述)
一.Java中注解Annotation 什么是注解:用来描述数据的数据(元数据). Java代码里的特殊标记.它为代码中添加用Java程序无法表达的额外信息提供一种形式化的方法,使用我们可以在未来的某 ...
- Spring(一)简述
一.Spring简述 一段费话 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2 ...