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