騰迅校園招聘筆試題:不使用中間變量實(shí)現(xiàn)strlen函數(shù)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
2009騰迅校園招聘筆試題:不使用中間變量求const字符串長(zhǎng)度,即實(shí)現(xiàn)求字符串長(zhǎng)度庫(kù)函數(shù)strlen函數(shù)。函數(shù)接口聲明如下:int strlen(const char *p);
思路分析:
?????“不使用中間變量”是說(shuō)程序員不能顯式的申請(qǐng)內(nèi)存,即不能有局部變量或者動(dòng)態(tài)內(nèi)存申請(qǐng)。如果函數(shù)自動(dòng)申請(qǐng)棧內(nèi)存或者使用寄存器存儲(chǔ)變量,或者使用立即數(shù)尋址即常量,那么就相當(dāng)于“不使用中間變量”。從函數(shù)原型看,返回值為int,那么在函數(shù)內(nèi)部必定需要一個(gè)地方存儲(chǔ)這個(gè)值,要么是常數(shù)要么是寄存器。長(zhǎng)度不為1時(shí)不能一次就求出來(lái),說(shuō)明必須有遞歸調(diào)用,這樣遞歸時(shí)函數(shù)會(huì)自動(dòng)申請(qǐng)棧內(nèi)存,這樣就相當(dāng)于程序員“不使用中間變量”了。中間返回的值通過(guò)寄存器自動(dòng)保存,最后一次返回時(shí)拷貝到int中去。C++中也有臨時(shí)對(duì)象的概念,都是程序在運(yùn)行過(guò)程中由編譯器在棧中自動(dòng)申請(qǐng)的對(duì)象,對(duì)程序員不可見(jiàn),也相當(dāng)于“不使用中間變量”
另外一個(gè)不申請(qǐng)任何變量的典型題目是:反轉(zhuǎn)字符串
?????? 這種問(wèn)題都是利用常量,或者將變量的申請(qǐng)交給編譯器在遞歸過(guò)程中自動(dòng)在棧中申請(qǐng)。
#includeusing?namespace?std; int?mystrlen(const?char*?str) { if(str==NULL) return?0; if(*str!='