程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 對面試題(劍指offer)產生的一些思考。,劍指offer

對面試題(劍指offer)產生的一些思考。,劍指offer

編輯:C++入門知識

對面試題(劍指offer)產生的一些思考。,劍指offer


零散的思緒。另外,推薦《劍指offer》。本文初期大部分思考都從劍指引發。

面試題不單單只是用來面試。其中有很多編程的經驗可以學習。就如同我們當年的考試:)

 

1:魯棒性的一個方面:邊界條件和異常處理。

  1,魯棒性:robust的中文音譯。本身就是健全性。

  2,面試中,經常出現一些簡單的代碼。考驗的就是一個程序員對邊界條件和異常處理的考慮。

    例如:字符串轉化為整數。本身題目非常簡單。但,我們應該能夠考慮到異常輸入有:英文/未知符號,負數,空指針,超大數值。

    另外,需要明確題目。如果面試官的要求是:字符串轉化為數字。需要問清楚,整數,還是浮點?。。。當然,也可能弄巧成拙,本來面試官只是想整數,但你既然問了,那就成全你吧:(

    如果是浮點,我們可能還要考慮,精度缺失的問題。我們就要考慮double的精度。

  3,對於鏈表,邊界中最不容易考慮的應該是:鏈表項數。

    例如:查找倒數K項,但實際鏈表項數 < K。

2:對數組操作的一些胡思亂想。

  1,C++數組最麻煩的一點是下標超出。我們當然可以用vector解決。但面試中,常常用這種事情來玩你。。。

  2,我對數組的遍歷,經常是for循環+數組個數。數組各數通常使用宏定義。但,這並不能解決超出問題。比如:把14打成15這種低級錯誤。所以,是否能夠有使用一種方式解決此問題?下面是我對此想法的一個嘗試。

/**********************************************************
 * \file array_t.cpp
 * \brief 
 * \note 
 * 
 * \version 
 * \author [email protected]
***********************************************************/
#include <iostream>

using namespace std;

int main( int argc, char **argv )
{
    int array[] = { 0, 1, 2, 3, 4};

    int iNumOfarray = sizeof( array ) / sizeof( array[0] );
    cout << iNumOfarray << endl;
    for( int i=0; i<iNumOfarray; i++)
    {
        cout << array[i] << endl;
    }
}

    1)此代碼中,嘗試用sizeof來解決循環問題。但我無法確定,此方法是否會有其他瑕疵。

    2)當然,更好的方法是使用vector。此代碼僅是一個簡單的討論性問題。如果有人對此有什麼想法。希望能夠聯系我(評論或郵件)。

    3)另外,此方法不使用將數組指針作為形參的函數,因為通過函數傳遞的數組,會在函數中自動退化成為普通的指針類型。

 3:對於C++常量字符串的一個疑惑。

/**********************************************************
 * \file string_t.cpp
 * \brief 
 * \note 
 * 
 * \version 
 * \author [email protected]
**********************************************************/
#include <iostream>
#include <stdlib.h>

using namespace std;

int main( int argc, char **argv )
{
    char str1[] = "Hello world.";
    char str2[] = "Hello world.";

    char *str3 = {"Hello world."};
    char *str4 = {"Hello world."};

    if( str1 == str2 )
        cout << "1==2" << endl;
    else
        cout << "1!=2" << endl;

    if( str3 == str4 )
        cout << "3==4" << endl;
    else
        cout << "3!=4" << endl;

    exit( 0 );
}

    1)這段代碼。最終執行的結果是:1!=2 3==4。劍指(指代劍指offer此書。本文不再重復)中指出,C++在常量字符串上進行了一定優化——str3/4指向同一個地址。我比較好奇的是,C++如何優化此問題。

    2)計算機如何將str3和str4識別成同一個字符串?

    3)此問題,可能涉及到編譯,執行和代碼內存分配等問題。個人暫時無法解答。留於此,作為記錄。

4:對於C++字符串的一些補充。

  1,一個空字符串中依然包含一個'\0'。已經經過代碼證實。

5:移動數據的一種方法:當從前往後移動數據,可能需要重復多次時;最好反置進行移動。因為從前往後移動時,很多數據會經歷多次向後移動的經歷。這點,對於字符串和數組操作尤其有效。

6:對於指針,必須判斷其是否為NULL。在劍指中2.3.3鏈表的添加節點函數中,並沒有對指向指針的指針進行判斷。也許是因為經驗性常識,但我個人認為此代碼並不完美。因為指向指針的指針,也同樣需要判斷。

  1,存在一個疑問:對空指針取地址,得到的結果是否和OS具體實現有關?

7:對於劍指鏈表的一個另類思路的嘗試。

  1,起因:劍指中,嘗試使用AddtoTail一個函數完成添加操作。它可以完成添加功能,但同時也完成了鏈表的創建。代碼如下(實現代碼省略):

void AddToTail( ListNode** pHead, int value )
{
    // contents....
    if ( *pHead == NULL )
    // contents...
}

 

 

    1)使用指向指針的指針的原因是:當往一個空鏈表中插入頭節點時,如果使用鏈表頭作為指針,會導致我們丟失鏈表頭。(具體解釋,可以查看劍指offer——或者email本人)

    2)而我的問題是,如果pHead本身就是NULL,這個函數會怎麼樣?劍指中,對於空指針異常警惕,所以對於此,我存有疑惑。是否是C++語言體系中,已經能夠保證NULL指針可以指向NULL?

    3)如果如上猜測,為何在removeNode函數中,又對phead本身進行了判斷?

    4)模擬性質的對此函數進行調用,發現似乎需要在外面先創建一個ListNode**的指針。用new?或者還是可以直接NULL。感覺此函數非常模糊不清。如果使用new,感覺多此一舉。

  2,對此函數,有兩個想法。

1 first mode
ListNode* AddToTail( ListNode* pHead, int value )  // 如果傳入指針為空,則直接返回一個頭指針。使用返回值來獲取頭指針。
2 second mode
ListNode* CreateList( int value );
void AddToTail( ListNode* pHead, int value );  // 相信都看的懂 :)
// 個人傾向此方法。雖然使用一個函數解決看起來更簡潔。但我更喜歡將行為拆解。

 

    1)個人無法認同劍指的鏈表函數,即使NULL真的指向NULL。即使使用該函數不會造成錯誤——但從邏輯上,很不美好:(

8:

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved