C/C++面試之演算法系列--借刀殺人,不使用任何中間變數實現strlen

來源:互聯網
上載者:User
 

 

借刀殺人,不使用任何中間變數實現strlen

 

Sailor_forever  sailing_9806@163.com 轉載請註明

http://blog.csdn.net/sailor_8318/archive/2008/10/13/3071048.aspx

 

 

 

2009騰迅校園招聘筆試題:不使用中間變數求const字串長度,即實現求字串長度庫函數strlen函數。函數介面聲明如下:int strlen(const char *p);

 

思路分析:

在字串中通常可以利用最後一個結束符’/0’,但此處參數為const,唯讀,那麼我們不能打他的主意

 

函數運行過程中不佔用記憶體基本不可能,除非都使用了寄存器。“不使用中間變數”只是說程式員不能顯示的申請記憶體而已,即不能有局部變數或者動態記憶體申請。

 

如果函數自動申請棧記憶體或者使用寄存器儲存變數,或者使用立即數定址即常量,那麼就相當於“不使用中間變數”。

 

從函數原型看,傳回值為int,那麼在函數內部必定需要一個地方儲存這個值,要麼是常數要麼是寄存器。長度不為1時不能一次就求出來,說明必須有遞迴調用,這樣遞迴時函數會自動申請棧記憶體,這樣就相當於程式員“不使用中間變數”了。中間返回的值通過寄存器自動儲存,最後一次返回時拷貝到int中去。

 

C++中也有臨時對象的概念,都是程式在運行過程中由編譯器在棧中自動申請的對象,對程式員不可見,也相當於“不使用中間變數”

 

另外一個不申請任何變數的典型題目是:反轉字串(http://blog.csdn.net/sailor_8318/archive/2008/10/11/3058240.aspx

 

這種問題都是利用常量,或者將變數的申請交給編譯器在遞迴過程中自動在棧中申請,也就是借刀殺人了,不管我的事,我只是出來打醬油的,哈哈

 

//////////////////////////////////////////////////////////////////////////

int NoMallocStrlen(const char *str)

{

        if (str==NULL)

        {

                return 0;

        }

 

        if (*str != '/0')

        {

                return 1+NoMallocStrlen(++str);

        }

        else

                return 0;

}

 

int main()

        const char *p  = "hello!";

        int a = NoMallocStrlen(p);

 

        if(a == strlen(p))

        {

                printf("NoMallocStrlen is well done!/n");

        }

        else

        {

                printf("Error!/n");

        }

}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.