開始自我介紹,問項目,然後問基礎知識,操作系統,網絡,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;
}