1. 程式人生 > >招銀科技2017 c++ 面試題

招銀科技2017 c++ 面試題

程式記憶體分佈,全域性變數、靜態變數的儲存位置

static修飾符作用

static全域性變數跟普通全域性變數區別,儲存方式有何區別c++設計一個單例模式,多執行緒環境下如何設計?用執行緒鎖是否會影響效能?有其他方案嗎介紹下c++ socket 模型, 建立tcp連線的步驟。多執行緒同步方式有哪些程序、執行緒的區別程序間有哪些通訊方式,各自優點是什麼。

拷貝建構函式引數為何必須為引用

筆試題量很大,可惜很多沒記住。大概講下有印象的考點:

資料庫方面考了很多,有很多我都沒聽過。

inner join,outer join,索引

軟體工程知識也不少,還有敏捷開發

32位機上編譯的 sizeof(char*),64位機子上輸出什麼?這題我覺得Linux上執行不了,win可以,但是我沒有32位機子,沒法測試,有人知道嗎?

異或運算

短小常用函式在c裡用什麼代替,c++裡用什麼代替

char* const p和char const * p的區別

這題說一個我的記憶方法:把*視為point to,然後從後往前讀,比如

char const * p就是p piont to a const char

char* const p就是p is const which point to a char

const char* p就是p point to a char which is const

所以char const * p和const char* p的意義是一樣的,p指向的記憶體不可變,char* const p的意義是p本身的值不可變。

建構函式內呼叫另一個建構函式

class A {
    int m_age;
    string m_name; 
public:
    A(const int& age){
        A(age, "");
    }
    A(const int& age, const string& name) : m_name(name), m_age(age){}
};

在java等平臺支援語言中這種寫法比較常見,但在c++中語法是沒問題,但是結果肯定不是你想要的。

A(const int& age){
    A(age, "");
}
在 A(const int& age)內呼叫A(age, ""),在棧上構造了另一個匿名A物件,然後函式返回,匿名物件被銷燬,然而當前物件成員卻沒有被初始化,成員值隨機。如果非要這樣寫來達到重用程式碼,可以這樣寫
A(const int& age) {
    new (this)A(age, "");
}

c11及以上支援在初始化列表中呼叫另一個建構函式,不能寫在函式體內。如

class A {
    int m_age;
    string m_name; 
public:
    A(const int& age) : A(age, "") {}
    A(const int& age, const string& name) : m_name(name), m_age(age){}
};

需要注意的是,被呼叫的建構函式必須完整初始化所有成員。所以A(const int& age) 可以呼叫A(const int& age, const string& name),而反過來不行。


程式設計題:

1. 實現單項鍊表反轉,只允許遍歷一次。

2. 兩個字串,實現判斷其中一個是不是另一個的子串,區分大小寫,同時還要寫test case

3. 傳入6個位元組長度的舊密碼、新密碼、再次輸入的新密碼三個字串指標,然後判斷是否符合以下規則:

新密碼不能跟舊密碼相同,兩次輸入的新密碼要相同,密碼為6位長度的數字的字元,新密碼不能是123456或654321這樣的有序數字或是666666這樣的同一個數字。

關鍵是這題程式碼只能在for迴圈裡裡填

int changePasswdIsOk(char* Old, char* New, char* New2) {

	if (Old == NULL || New == NULL || New2 == NULL)
		return 0;

	for (int i = 0; i < 6; i++) {
	
	}

}

本來看到這種題,一般會在迴圈外定義標誌位用來儲存上一次的狀態,然後與下次迴圈判斷結果相與,但是這題要求只能在迴圈內寫程式碼,當時是有一點點思路的,就是在迴圈內建立靜態標誌位,但是想著想著最後還是要在迴圈外判斷最終結果才能返回最終結果,時間又緊,下場面試的人已經在催了,就放棄了。回到家中還是沒啥思路,想百度也不知道搜什麼關鍵詞,後來又想了想,寫出來了:

bool changePasswdIsOk(const char Old[], const char New[], const char New2[]) {

    if (Old == NULL || New == NULL || New2 == NULL)
        return false;

    for (int i = 0; i < 6; i++) {
        static bool EachIsSame = true;
        static bool isOrderedInc = true;
        static bool isOrderedDec = true;
        static bool isSameWithOld = true;

        if (New[i] != New2[i])
            return false;
        if ('0' > New[i] || '9' < New[i])
            return false;
        
        if (isSameWithOld && New[i] != Old[i])
            isSameWithOld = false;
        
        if (i < 5) {
            if (EachIsSame && New[i] != New[i + 1]  )
                EachIsSame = false;
            if (isOrderedInc && New[i] != New[i + 1] - 1)
                isOrderedInc = false;
            if (isOrderedDec && New[i] != New[i + 1] + 1)
                isOrderedDec = false;
        }
        else 
            return !(isSameWithOld || EachIsSame || isOrderedInc || isOrderedDec);
    }
    return true;
}
測了下都通過了。

上上週五去二面了,之前接到二面通知還挺高興的,還以為過了一面,結果好像去了一面的人都去二面了。然後所有崗位的就兩個面試官輪著面,其中一個還是HR。我還是第一次遇到這樣的,不知怎麼形容。

二面HR問我的核心賣點是什麼,問以前單位離職原因,問期望薪資。技術讓我挑一個最值得講的專案講,然後問我最大的難點在哪。後來問,有一個很大的檔案,比如一個G,要怎麼傳比較好。我說切成多片,多執行緒傳輸。他感覺不是很滿意。但也沒說應該怎麼傳。後來我問了幾個朋友,也都說會切片傳輸。算上那個可有可無的心理測試,等了快有一個半小時,然後面試十分鐘不到就灰溜溜的回去了,當然之後也沒後續了。