很棒的講解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;
}
}