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里面)
  1. # The API: int read4(char *buf) reads 4 characters at a time from a file.
  2. # 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.
  3. # By using the read4 API, implement the function int read(char *buf, int n) that reads n characters from the file.
  4. # Note:
  5. # The read function will only be called once for each test case.
  6. # Hide Company Tags Facebook
  7. # Hide Tags String
  8. # Hide Similar Problems (H) Read N Characters Given Read4 II - Call multiple times
  9. # The read4 API is already defined for you.
  10. # @param buf, a list of characters
  11. # @return an integer
  12. # def read4(buf):
  13. class Solution(object):
  14. def read(self, buf, n):
  15. """
  16. :type buf: Destination buffer (List[str])
  17. :type n: Maximum number of characters to read (int)
  18. :rtype: The number of characters read (int)
  19. """
  20. eof, nbytes = False, 0
  21. while not eof and nbytes<n:
  22. buf4 = [""]*4
  23. nread = read4(buf4)
  24. if nread<4:
  25. eof = True
  26. nnext = min(nread, n-nbytes)
  27. for i in xrange(nnext):
  28. buf[nbytes+i]=buf4[i]
  29. nbytes+=nnext
  30. return nbytes
  1. # The API: int read4(char *buf) reads 4 characters at a time from a file.
  2. # 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.
  3. # By using the read4 API, implement the function int read(char *buf, int n) that reads n characters from the file.
  4. # Note:
  5. # The read function may be called multiple times.
  6. # Hide Company Tags Bloomberg Google Facebook
  7. # Hide Tags String
  8. # Hide Similar Problems (E) Read N Characters Given Read4
  9. # The read4 API is already defined for you.
  10. # @param buf, a list of characters
  11. # @return an integer
  12. # def read4(buf):
  13. class Solution(object):
  14. def __init__(self):
  15. self.bufbytes, self.offset = 0,0
  16. self.buf4 = [""]*4
  17. def read(self, buf, n):
  18. """
  19. :type buf: Destination buffer (List[str])
  20. :type n: Maximum number of characters to read (int)
  21. :rtype: The number of characters read (int)
  22. """
  23. eof, nbytes = False, 0
  24. while not eof and nbytes<n:
  25. if self.bufbytes==0:
  26. self.bufbytes = read4(self.buf4)
  27. if self.bufbytes<4: # error: don't forget
  28. eof = True
  29. toread = min(n-nbytes, self.bufbytes)
  30. #print toread,self.offset
  31. for i in xrange(toread):
  32. buf[nbytes+i]=self.buf4[self.offset+i]
  33. self.offset+=toread
  34. if self.offset >= 4: # error: >=4, last index is 3
  35. self.offset-=4
  36. self.bufbytes-=toread
  37. nbytes+=toread
  38. return nbytes

边工作边刷题:70天一遍leetcode: day 73的更多相关文章

  1. 边工作边刷题:70天一遍leetcode: day 89

    Word Break I/II 现在看都是小case题了,一遍过了.注意这题不是np complete,dp解的time complexity可以是O(n^2) or O(nm) (取决于inner ...

  2. 边工作边刷题:70天一遍leetcode: day 77

    Paint House I/II 要点:这题要区分房子编号i和颜色编号k:目标是某个颜色,所以min的list是上一个房子编号中所有其他颜色+当前颜色的cost https://repl.it/Chw ...

  3. 边工作边刷题:70天一遍leetcode: day 78

    Graph Valid Tree 要点:本身题不难,关键是这题涉及几道关联题目,要清楚之间的差别和关联才能解类似题:isTree就比isCycle多了检查连通性,所以这一系列题从结构上分以下三部分 g ...

  4. 边工作边刷题:70天一遍leetcode: day 85-3

    Zigzag Iterator 要点: 实际不是zigzag而是纵向访问 这题可以扩展到k个list,也可以扩展到只给iterator而不给list.结构上没什么区别,iterator的hasNext ...

  5. 边工作边刷题:70天一遍leetcode: day 101

    dp/recursion的方式和是不是game无关,和game本身的规则有关:flip game不累加值,只需要一个boolean就可以.coin in a line II是从一个方向上选取,所以1d ...

  6. 边工作边刷题:70天一遍leetcode: day 1

    (今日完成:Two Sum, Add Two Numbers, Longest Substring Without Repeating Characters, Median of Two Sorted ...

  7. 边工作边刷题:70天一遍leetcode: day 70

    Design Phone Directory 要点:坑爹的一题,扩展的话类似LRU,但是本题的accept解直接一个set搞定 https://repl.it/Cu0j # Design a Phon ...

  8. 边工作边刷题:70天一遍leetcode: day 71-3

    Two Sum I/II/III 要点:都是简单题,III就要注意如果value-num==num的情况,所以要count,并且count>1 https://repl.it/CrZG 错误点: ...

  9. 边工作边刷题:70天一遍leetcode: day 71-2

    One Edit Distance 要点:有两种解法要考虑:已知长度和未知长度(比如只给个iterator) 已知长度:最好不要用if/else在最外面分情况,而是loop在外,用err记录misma ...

随机推荐

  1. DP入门---Robberies

    HDU  2955 Description The aspiring Roy the Robber has seen a lot of American movies, and knows that ...

  2. linux查看rpm包创建的所有目录和文件

    有不少时候,我们需要查看某个rpm创建的所有目录和文件,出于了解程序结构或者其他目的,但是对于这个rpm包我们又不怎么熟悉,这个时候可以通过rpm -ql rpm名称查看. 但是rpm名称有可能又忘了 ...

  3. [CLK Framework] CLK.Threading.PortableTimer - 跨平台的Timer类别

    [CLK Framework] CLK.Threading.PortableTimer - 跨平台的Timer类别 问题情景 开发应用程式的时候,免不了需要加入一些定时执行的设计,例如说:定时更新画面 ...

  4. Play 内置模板标签(1.2.3版本)http://www.anool.net/?p=617

    a标签: 用来插入一个连接到控制器方法的html link.如下: #{a @Application.logout()}Disconnect#{/a}模板内容被解析后变成: <a href=&q ...

  5. SAP数据更新的触发

    SAP 应用系统架构         应用层运行着DIALOG进程,每个DIALOG进程绑定一个数据库进程,DIALOG进程与GUI进行通信,每次GUI向应用服务器发送请求时都会通过dispatche ...

  6. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q111-Q114)

    Question 111You create a custom page layout that contains the following code segment. (Line numbers ...

  7. Android子线程更新UI主线程方法之Handler

    背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. ...

  8. UIScrollView循环滚动1

    现在基本每一个商业APP都会有循环滚动视图,放一些轮播广告之类的,都是放在UIScrollView之上.假如我要实现N张图片的轮播,我借鉴了几个博文,得到两种方法实现: [第一种]:如下图(图片来源于 ...

  9. Android Activity使用拾遗

    一.onWindowFocusChanged 有时我们需要测量一个Activity多长时间才能显示出来,那么在代码中打点计时的时机选在哪儿呢?在onCreate和onResume执行完成后,Activ ...

  10. UIlable 属性详用

    我的好朋友给我制定了一个新的学习方法,从新的看每个控件,去了解他的每个属性,方法来让自己对oc的认识更加充实 今天重新认识一下UILable 的属性lable的阴影设置: 阴影的偏移量是以lable中 ...