158 Read N Characters Given Read4 II Call multiple times

很棒的講解https://www.youtube.com/watch?v=TYokkbftEx8
這道題的意思跟i最大的區(qū)別就是要連續(xù)call的話,不再每次讀都從頭開始,而是從上一次讀完的地方開始。

比如text stream = "abcdefg"
我們之前只call一次的read(4)就會(huì)得到buf = [abcd];再call read(6)又會(huì)得到buf = [abcdef]; 但現(xiàn)在我們call multiple times的話,read(4)會(huì)得到buf = [abcd], 再read(2)的話就會(huì)得到buf = [ef]. 就是這個(gè)區(qū)別。

根據(jù)題意,頭腦里會(huì)想到這下子肯定需要一個(gè)pointer來(lái)表示我們讀到了文件的哪里,但是題目沒有input stream, 所以要?jiǎng)幽X筋想怎么用現(xiàn)有的輸入來(lái)完成這個(gè)。這就要求我們把char[] temp, count, pointer作為全局變量,這樣我們屢次call read()的時(shí)候這些量不會(huì)變。 為什么index不需要成為全局變量呢,因?yàn)槊看蝦ead都要返回實(shí)際讀過(guò)的數(shù)index, 所以是函數(shù)內(nèi)部的局部變量。比如上面的例子里,我們第一次call read(4), 那么首先我們檢查pointer是否為0, 為零的意思是我們已經(jīng)讀完了之前得到的char[4] temp, (因?yàn)閜ointer就是用來(lái)遍歷temp的,只有讀完了我們才會(huì)重置為0)。

如果pointer為零我們就要重新調(diào)用read4得到新的temp和更新count. 此時(shí)如果得到的count為零,說(shuō)明沒有可以再讀的內(nèi)容,我們跳出循環(huán)返回index。如果不為零,我們就開始讀寫(讀temp寫入buf). 這里我們要注意控制while循環(huán)的執(zhí)行條件,一是顯而易見的index < n因?yàn)槲覀儾荒茏x超過(guò)max = n的數(shù),同時(shí)還要保證pointer < count, 因?yàn)槲覀兊膖emp只有count這么多個(gè)數(shù),你讀不了更多。循環(huán)體內(nèi)部就是讀寫步驟buf[index++] = temp[i++]; 最后檢查pointer 是否等于count, 等于的話說(shuō)明這個(gè)temp被讀完了。如果pointer 不等于count,但index已經(jīng)等于n了,是什么情況呢?比如temp = [abcd], 想要得到的buf = [ab],則我們的pointer會(huì)等于2,不會(huì)等于count = 4. 這時(shí)候我們的pointer, count因?yàn)槭侨肿兞浚梢栽谙乱淮蝐all的時(shí)候繼續(xù)利用。
比如這時(shí)候我們?cè)賑all read(2),實(shí)際上此時(shí)pointer就不等于0,而是等于2.那么我們就不需要新讀出一個(gè)temp, 而是要繼續(xù)讀完上一次沒讀完的temp. 直接進(jìn)入while 循環(huán)繼續(xù)讀寫。得到buf[cd]的時(shí)候剛好index == n并且pointer == count.這時(shí)候pointer == count我們要重置pointer. 最后返回index.

/* 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
     */
/*    
        "abcdefgh"
        index = 0; pointer = 0
        n = 2 temp = [abcd] count = 4 
        buf[ab]




*/  public int pointer = 0;
    public int count = 0;
    public char[] temp = new char[4];
    public int read(char[] buf, int n) {
        int index = 0;
        while (index < n){
            if (pointer == 0){
                count = read4(temp);
            }
            if (count == 0){
                break;
            }
            while (index < n && pointer < count){
                buf[index++] = temp[pointer++];
            }
            if (pointer == count){
                pointer = 0;
            }
        }
        return index;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容