开始自我介绍,问项目,然后问基础知识,操作系统,网络,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;
}

 

更多推荐