騰訊3.28客戶端面試一面面經

開始自我介紹,問項目,然後問基礎知識,操作系統,網絡,C++這些,最後兩道編程題。

 

冒泡排序的遞歸寫法:

自己開始寫的雙層for循環的寫法,自己開始寫的神奇方法把自己和麪試官都搞懵逼了,後來發現自己寫的代碼其實是有問題的,並不是冒泡排序(相鄰兩個數,比較交換),只是每次保證i位置元素最小,類似選擇排序?

#include <iostream>
using namespace std;

void bubble_sort(int arr[], int n){
    for(int i = 0; i < n; i++){
      for(int j = i; j < n; j++){
        if(arr[i] > arr[j]){
            swap(arr[i], arr[j]);
        } 
    }
    }
}
int main() {
    int arr[] = {5, 4, 2, 3, 6};
    int n = 5;
    bubble_sort(arr, 5);
    for(int i = 0; i < n; i++){
        cout<<arr[i]<<endl;
    }
}

然後在面試官的提示下改成了遞歸寫法,去掉了一個for,一層一層遞歸,還是類似選擇排序的方法。 

#include <iostream>
using namespace std;

void bubble_sort(int arr[], int i, int n){
   for(int j = i; j < n; j++){
        if(arr[i] > arr[j]){
            swap(arr[i], arr[j]);
        } 
   }
   if( i < n ) bubble_sort(arr, i + 1, n);
}
int main() {
    int arr[] = {5, 4, 2, 3, 6};
    int n = 5;
    bubble_sort(arr, 0, 5);
    for(int i = 0; i < n; i++){
        cout<<arr[i]<<endl;
    }
}

最後自己查了一下,這個纔是真正的冒泡排序啊!比較相鄰元素,大元素上冒,然後每次上邊界-1

加一個flag判斷,假如不需要排序了,直接退出即可

非遞歸寫法

#include <iostream>
using namespace std;

void bubble_sort(int arr[], int n) {
    for (int i = n - 1; i >= 0; i--) {//排序的上界,每次減1
        int flag = 0;
        for (int j = 0; j < i; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr[j + 1], arr[j]);
                flag = 1;
            }
            if (!flag) return;
        }
    }
}
int main() {
    int arr[] = { 5, 4, 2, 3, 6 };
    int n = 5;
    bubble_sort(arr, 5);
    for (int i = 0; i < n; i++) {
        cout << arr[i] << endl;
    }
}

 遞歸寫法, 上界要寫成n-1,防止越界

#include <iostream>
using namespace std;

void bubble_sort(int arr[], int n) {
    int flag = 0;
    for (int i = 0; i < n - 1; i++) {
        if (arr[i] > arr[i + 1]) {
            swap(arr[i + 1], arr[i]);
            flag = 1;
        }
    }
    if (!flag) return;
    if (n > 0) bubble_sort(arr, n - 1);
}
int main() {
    int arr[] = { 5, 4, 2, 3, 6 };
    int n = 5;
    bubble_sort(arr, 5);
    for (int i = 0; i < n; i++) {
        cout << arr[i] << endl;
    }
}

實現雙向隊列,實現頭尾插入或者刪除

寫隊列,自己直接就想到了數組的方法,寫完之後面試官就問如果超出容量怎麼辦;想了一會纔想到採用鏈表的方法,真是太菜了。

然後在寫的過程中發現對於類的定義和指針操作這些不熟練,邊寫邊害怕是不是寫錯了。

#include <iostream>
using namespace std;


class deque {
    struct Node {
        int num;
        Node* pre;
        Node* next;
        Node(int n) :num(n), pre(NULL), next(NULL) {
        }
    };
    struct Node* front;
    struct Node* back;

public:
    deque(int num) {
        front = new struct Node(num);
        back = front;
    }
    void front_insert(int num) {
        struct Node* ptr = new struct Node(num);
        front->next = ptr;
        ptr->pre = front;
        front = front->next;
    }
    void back_insert(int num) {
        struct Node* ptr = new struct Node(num);
        back->pre = ptr;
        ptr->next = back;
        back = back->pre;
    }
    void front_delete() {
        struct Node* tmp = front;
        front = front->pre;
        front->next = nullptr;
        delete tmp;
    }
    void back_delete() {
        struct Node* tmp = back;
        back = back->next;
        back->pre = nullptr;
        delete tmp;
    }
};
int main() {

    deque q(-1);
    q.front_insert(2);
    q.back_insert(2);
    q.front_insert(4);
    q.back_insert(5);
    q.front_delete();
    q.back_delete();
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章