找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2852|回复: 3
收起左侧

[米群网刷题小分队] 【LeetCode小分队】【Read N Characters Given Read4 II 】-【刷题第一弹2014】

[复制链接]

90

主题

46

精华

1908

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1908

热心会员突出贡献优秀版主最佳新人精华帖之王活跃会员

发表于 12-5-2014 09:50 PM | 显示全部楼层 |阅读模式

亲!马上注册或者登录会查看更多内容!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 MengMa 于 12-5-2014 09:51 PM 编辑

快捷通道:
https://oj.leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/

题目:

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 【i】n characters from the file.

The read function may be called multiple times.


建议的回复格式:(如果大家有更好的格式可以补充哦)
思路:(必填)
代码:(必填)
复杂度分析:(必填)
细节和陷阱:(选填)
相似题目:(选填)


=========点击传送门查看所有题目哟========
                            汇总贴 传送门
==================================

90

主题

46

精华

1908

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1908

热心会员突出贡献优秀版主最佳新人精华帖之王活跃会员

 楼主| 发表于 12-5-2014 09:51 PM | 显示全部楼层
本帖最后由 MengMa 于 12-6-2014 05:08 PM 编辑

【转载自:LeetCode 官方答案】
思路:
i. buffer – An array of size 4 use to store data returned by read4 temporarily. If
the characters were read into the buffer and were not used partially, they will
be used in the next call. (mitbbs: sleeper7 - 就是把read4多读出来的存起来, 下次先读这段剩余的 )

ii. offset – Use to keep track of the offset index where the data begins in the next
read call. The buffer could be read partially (due to constraints of reading up
to n bytes) and therefore leaving some data behind.

iii. bufsize – The real buffer size that stores the actual data. If bufsize > 0, that
means there is partial data left in buffer from the last read call and we should
consume it before calling read4 again. On the other hand, if bufsize == 0, it
means there is no data left in buffer

代码:
  1. public class Solution extends Reader4
  2. {
  3.     private char[] buffer = new char[4];
  4.     int offset = 0, bufsize = 0;
  5.     public int read(char[] buf, int n)
  6.     {
  7.         int readBytes = 0;
  8.         boolean eof = false;
  9.         while(!eof && readBytes < n)
  10.         {
  11.             int size = (bufsize > 0) ? bufsize : read4(buffer);
  12.             if(bufsize == 0 && size < 4) eof = true;
  13.             int bytes = Math.min(n - readBytes, size); // attention.
  14.             System.arraycopy(buffer, offset, buf, readBytes, bytes); //src, srcPos, dest, destPos, length
  15.             offset = (offset + bytes)%4;
  16.             bufsize = size - bytes;
  17.             readBytes += bytes;
  18.         }
  19.         return readBytes;
  20.     }
  21. }
复制代码

回复 支持 反对

使用道具 举报

90

主题

46

精华

1908

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1908

热心会员突出贡献优秀版主最佳新人精华帖之王活跃会员

 楼主| 发表于 12-5-2014 10:08 PM | 显示全部楼层
nuswufei的讨论帖
shileiwill的讨论帖

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表