一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 4093|回复: 13
收起左侧

[算法题] Google: Read4k

[复制链接] |试试Instant~ |关注本帖
Interviwer 发表于 2014-11-1 14:22:20 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
Given API: int Read4096(char* buf);
It reads data from a file and records the position so that the next time when it is called it read the next 4k chars (or the rest of the file, whichever is smaller) from the file. The return is the number of chars read.

Todo: Use above API to Implement API
"int Read(char* buf, int n)" which reads any number of chars from the file.

评分

2

查看全部评分

 楼主| Interviwer 发表于 2014-11-1 14:23:12 | 显示全部楼层
我自己写了一个,希望指正!
  1. int Read(char* buf, int n) {
  2.     char buffer[4096];
  3.     int count = 0;
  4.     int remain = n;
  5.     int tmp = 4096;

  6.     while(remain > 0 && tmp == 4096) {
  7.         tmp = Read4k(buffer);
  8.         if(tmp < remain) {
  9.             memcpy(buf+count, buffer, tmp);
  10.             count += tmp;
  11.             remain -= tmp;
  12.         }else {
  13.             memcpy(buf+count, buffer, remain);
  14.             return n;
  15.         }   
  16.     }   
  17.     return count;
  18. }
复制代码

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

还来得及吗 发表于 2014-11-2 12:29:24 | 显示全部楼层
用java的路过。。
感觉这个用java写的话要改API了
回复 支持 反对

使用道具 举报

luzhuzeng 发表于 2014-11-2 13:24:24 | 显示全部楼层
Interviwer 发表于 2014-11-1 00:23
我自己写了一个,希望指正!

else 里面没有更新count
回复 支持 反对

使用道具 举报

 楼主| Interviwer 发表于 2014-11-2 13:36:52 | 显示全部楼层
luzhuzeng 发表于 2014-11-2 13:24
else 里面没有更新count

对啊,直接return了,就不用更新了
回复 支持 反对

使用道具 举报

luzhuzeng 发表于 2014-11-3 07:34:09 | 显示全部楼层
Interviwer 发表于 2014-11-1 23:36
对啊,直接return了,就不用更新了

抱歉,我看错了
回复 支持 反对

使用道具 举报

海拔2纳米 发表于 2014-11-4 03:42:11 | 显示全部楼层
还来得及吗 发表于 2014-11-2 12:29
用java的路过。。
感觉这个用java写的话要改API了

没必要啊,char *变成char[]就行了,其他都一样吧
回复 支持 反对

使用道具 举报

zhaoweigg 发表于 2014-11-12 08:43:16 | 显示全部楼层
Interviwer 发表于 2014-11-1 14:23
我自己写了一个,希望指正!

lz你这个只能call 一次吧,如果我连续 call呢:
Read(buf, 1);
Read(buf, 1);

我觉得返回应当是连续两个char 吧,按lz的这个code跑的话,两次返回的char会不会差4096?

因为Read4k()这个function 内部应当有个file pointer追踪上次读到哪了,所以每次call Read4k()都是从新地方开始
回复 支持 反对

使用道具 举报

 楼主| Interviwer 发表于 2014-11-12 13:26:47 | 显示全部楼层
zhaoweigg 发表于 2014-11-12 08:43
lz你这个只能call 一次吧,如果我连续 call呢:
Read(buf, 1);
Read(buf, 1);

嗯,确实只能call一次,如果多次,就要建一个class
回复 支持 反对

使用道具 举报

王可雪 发表于 2014-11-12 14:15:47 | 显示全部楼层
本帖最后由 王可雪 于 2014-11-12 14:24 编辑

buffer是干什么用的?把文件之前的内容重置吗?我懂了,最后一次,可能读的少,要往回调。
回复 支持 反对

使用道具 举报

richardzrc 发表于 2014-12-10 19:40:39 | 显示全部楼层
为啥 我写的 这么简单 是理解错了意思么

int Read(char* buf, int n)
{
    char buffer[4097];
    int ttcnt=0;
    while(n>0)
    {
        int curcnt=Read4096(buffer);
        ttcnt+=curcnt;
        n-=curcnt;
        memcpy(buf, buffer, cnt);
        //if(curcnt<4096)
        //    return ttcnt;
        buf+=curcnt;
    }
    return ttcnt;
}
回复 支持 反对

使用道具 举报

richardzrc 发表于 2014-12-10 20:02:00 | 显示全部楼层
Sorry, 我犯了一个错误,没有弄清楚 Read4096的具体功能。因为即使没有了也会读取,返回0个字节。
int Read(char* buf, int n)
{
    char buffer[4097];
    int ttcnt=0;
    bool eof=0;
    while(!eof && n>0)
    {
        int curcnt=Read4096(buffer);
        if(curcnt < 4096)
            eof=1;
        ttcnt+=curcnt;
        n-=curcnt;
        memcpy(buf, buffer, curcnt);
        buf+=curcnt;
    }
    return ttcnt;
}
回复 支持 反对

使用道具 举报

richardzrc 发表于 2014-12-10 21:19:58 | 显示全部楼层
另外 如果 需要 重复 多次 调用Read函数的话,似乎如果一次4bytes 读 然后read(buf, 1) read(buf, 1)  read(buf, 3) 最后一次3个字节还是 读不了哦 即使文件里还有数据。我看leetcode那个答案好像 是不可以的哦
回复 支持 反对

使用道具 举报

alex2013 发表于 2014-12-11 03:57:58 | 显示全部楼层
有人提供一个java版本的是用for循环来copy字符的嘛?网上有用System.arraycopy(buffer /* src */, 0 /* srcPos */, buf /* dest */, readBytes /* destPos */, bytes /* length */); 但是自己写的用for循环来把字符从自己的buffer copy到输出buf时,总会报错。
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-11 01:32

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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