1. 程式人生 > >筆試刷題總結

筆試刷題總結

今天刷了一些筆試題,以下是刷完筆試題後看到的相關知識點的解析,做個小結。

1、多型主要以兩種形式,靜態多型和動態多型,靜態多型主要實現了函式過載和運算子過載。動態多型主要實現了虛擬函式。虛擬函式是動態聯編,程式在執行的過程中確定呼叫哪一個函式。

2、int *s[8]; //定義一個指標陣列,該陣列中每個元素是一個指標,每個指標指向哪裡就需要程式中後續再定義了。 
int (*s)[8]; //定義一個數組指標,該指標指向含8個元素的一維陣列(陣列中每個元素是int型)。 

區分int *p[n]; 和int (*p)[n]; 就要看運算子的優先順序了。 
int *p[n]; 中,運算子[ ]優先順序高,先與p結合成為一個數組,再由int*說明這是一個整型指標陣列。 
int (*p)[n]; 中( )優先順序高,首先說明p是一個指標,指向一個整型的一維陣列。

3、計算機系統中,從內到外, 硬體系統,作業系統,支撐軟體,應用軟體。

下面是筆試題的程式設計練習:

題目1:

在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        if(array.empty()) return false;
        int row = array.size();//行
        int column = array[0].size();//列
        for(int i = 0; i < row; i++)
        {
            int left = 0;
            int right = column - 1;
            while(left <= right)
            {
                int mid = (left + right) / 2;
                if(target < array[i][mid])
                {
                    right = mid - 1;
                }
                else if(target > array[i][mid])
                {
                    left = mid + 1;
                }
                else
                {
                    return true;
                }              
            }
        }
        return false;
    }
};

題目2:

大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。

n<=39

class Solution {
public:
    int Fibonacci(int n) {
        int f[40];
        f[0] = 0;
        f[1] = 1;
        for(int i = 2; i <= n; i++)
        {
            f[i] = f[i - 1] + f[i - 2];
        }
        return f[n];
    }
};

題目3:

在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        if(array.empty()) return false;
        int row = array.size();//行
        int column = array[0].size();//列
        for(int i = 0; i < row; i++)
        {
            int left = 0;
            int right = column - 1;
            while(left <= right)
            {
                int mid = (left + right) / 2;
                if(target < array[i][mid])
                {
                    right = mid - 1;
                }
                else if(target > array[i][mid])
                {
                    left = mid + 1;
                }
                else
                {
                    return true;
                }              
            }
        }
        return false;
    }
};

題目4:

輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> array;
        if(head == NULL) return array;
        stack<int> s;
        ListNode* p = head;
        while(p != NULL) {
            s.push(p->val);
            p = p->next;
        }
        while(!s.empty()) {
            array.push_back(s.top());
            s.pop();
        }
        return array;
    }
};
新增筆記