• 边工作边刷题: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
            	
        
    
  • 相关阅读:
    Class的用途
    Flash网络编程安全沙箱问题隆重解决 (转)
    带参数的EventDispatcher
    Object的效率
    Oracle数据库语言修改成UTF8
    Python之字符串详解1
    初级/中级/高级运维,你是哪一级?
    这可能是php世界中最好的日志库——monolog
    vc程序大小优化最佳方案(转)http://blog.sina.com.cn/s/blog_4c50333c0100gjs3.html
    C# 调用lua 报错未能加载文件或程序集“lua51.dll”或它的某一个依赖项。找不到指定的模块。 解决方法
  • 原文地址:https://www.cnblogs.com/absolute/p/5815662.html
Copyright © 2020-2023  润新知