158. 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 n characters from the file.
Note:
The read function may be called multiple times.

Solution:需先讀Cache

思路:
The only thing is when you call read4() which reads 4 bytes into your buffer you might read more than you need, so you want to store those bytes in the structure, and next time you call read will start from those stored bytes, then read more from the file.

變化是這樣:比如先call了n=3,然后call n=5,那么第一次就讀入了4個char嘹锁,第二次call應(yīng)該把上一次的最后一個char拿來。也就是說要有個cache取緩存已讀取的字符剧董,然后從這個cache里面取。

Time Complexity: O(N) Space Complexity: O(1)

Solution Code:

/* The read4 API is defined in the parent class Reader4.
      int read4(char[] buf); */

public class Solution extends Reader4 {
    /**
     * @param buf Destination buffer
     * @param n   Maximum number of characters to read
     * @return    The number of characters read
     */
    char[] prevBuf = new char[4];
    int prevSize = 0;
    int prevIndex = 0;
    
    public int read(char[] buf, int n) {
        int counter = 0;
        
        while (counter < n) {
            if (prevIndex < prevSize) {
                buf[counter++] = prevBuf[prevIndex++];
            } else {
                prevSize = read4(prevBuf);
                prevIndex = 0;
                if (prevSize == 0) {
                    // no more data to consume from stream
                    break;
                }
            }
        }
        return counter;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末破停,一起剝皮案震驚了整個濱河市翅楼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌真慢,老刑警劉巖毅臊,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異黑界,居然都是意外死亡管嬉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門朗鸠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚯撩,“玉大人,你說我怎么就攤上這事烛占√タ妫” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵忆家,是天一觀的道長犹菇。 經(jīng)常有香客問我,道長芽卿,這世上最難降的妖魔是什么揭芍? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮卸例,結(jié)果婚禮上称杨,老公的妹妹穿的比我還像新娘。我一直安慰自己筷转,他們只是感情好列另,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旦装,像睡著了一般页衙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阴绢,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天店乐,我揣著相機與錄音,去河邊找鬼呻袭。 笑死眨八,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的左电。 我是一名探鬼主播廉侧,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼页响,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了段誊?” 一聲冷哼從身側(cè)響起闰蚕,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎连舍,沒想到半個月后没陡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡索赏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年盼玄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潜腻。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡埃儿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出融涣,到底是詐尸還是另有隱情蝌箍,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布暴心,位于F島的核電站妓盲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏专普。R本人自食惡果不足惜悯衬,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望檀夹。 院中可真熱鬧筋粗,春花似錦、人聲如沸炸渡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚌堵。三九已至买决,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吼畏,已是汗流浹背督赤。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泻蚊,地道東北人躲舌。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像性雄,于是被迫代替她去往敵國和親没卸。 傳聞我的和親對象是個殘疾皇子羹奉,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容