面临着找实习,很多东西需要复习, 特写此博客,将一些需要温习的知识点罗列出来,供自身学习,其中部分知识点摘自他人的博客,文章中有注明出处(若侵犯原作者相关权益,可联系博主删除),若有出错,还望各位点明。
Linux 常用指令学习
Linux 50个常用指令TCP/IP协议学习
TCP/IP协议三次握手与四次握手流程解析链表的操作
ps:增删这一块,写的没有那么健壮,有些可能出现的问题,我没有加上判断,只是单纯试试能不能实现功能,#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<string>
#include<iostream>
#include<cmath>
using namespace std;
typedef struct lnode{
int data;
struct lnode * next;
}LNode,*LinkList;
LinkList create(){
LNode *s,*r;
LinkList L=NULL;
int x;
while(~scanf("%d",&x)){
if(x==0)
break;
s=(LNode * )malloc(sizeof(LNode));
s->data=x;
if(L==NULL)
L=s;
else
r->next = s;
r=s;
}
if(r->next!=NULL) r->next=NULL;
return L;
}
void print(LinkList L ){
LNode *s;
s=L;
while(s){
printf("%d\n",s->data);
s=s->next;
}
}
void add(LinkList L ,int i, int data){
LNode *p=L;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
LNode *s;
s=(LNode *) malloc(sizeof(LNode));
s->data=data;
s->next=p->next;
p->next=s;
}
void del(LinkList L,int i){
LNode *p=L;
int j=0;
while(p->next&&j<i-1){
p=p->next;
j++;
}
LNode *s;
s=p->next;
p->next=s->next;
free(s);
}
int main()
{
LinkList L=create();
print(L);
add(L,1,10);
print(L);
del(L,3);
print(L);
}
排序的实现
- 冒泡排序:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<string>
#include<iostream>
#include<cmath>
#include<ctime>
using namespace std;
int main()
{
srand((unsigned)time(NULL));
int a[20];
for(int i=0;i<20;i++){
a[i]=rand()%101;
}
for(int i=0;i<20;i++){
printf("%d ",a[i]);
}
printf("\n");
for(int i=0;i<20-1;i++)
for(int j=0;j<20-i-1;j++){
if(a[j]>a[j+1])
swap(a[j],a[j+1]);
}
for(int i=0;i<20;i++){
printf("%d ",a[i]);
}
printf("\n");
}
2.快速排序(随机快排)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<string>
#include<iostream>
#include<cmath>
#include<ctime>
using namespace std;
void quickSort(int a[],int l,int r) //随机化快排
{
if(l<r)
{
int t=rand()%(r-l+1)+l; //在l-r中随机选取一个元素与a[l]交换
swap(a[t],a[l]);
int i=l,j=r,x=a[l];
while(i<j)
{
while(i<j&&a[j]>=x) //从右往左找第一个小于x的值
j--;
if(i<j)
{
a[i++]=a[j]; //因为a[l]的值已经保存在x中了,因此整个数组里就会留下一个位置进行数据交换
}
while(i<j&&a[i]<x) //从左往右找第一个大于等于x的值
i++;
if(i<j)
{
a[j--]=a[i];
}
}
a[i]=x; //循环完成后,i之前的元素都小于x,i之后的元素都大于x
quickSort(a,l,i-1);
quickSort(a,i+1,r);
}
}
int main()
{
srand((unsigned)time(NULL));
int a[20];
for(int i=0; i<20; i++)
{
a[i]=rand()%101;
}
for(int i=0; i<20; i++)
{
printf("%d ",a[i]);
}
printf("\n");
quickSort(a,0,20-1);
for(int i=0; i<20; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
哈夫曼树的构造
构造哈夫曼树的样例分析二叉搜索树的创建
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
struct Binary_Node{
int data;
Binary_Node *left;
Binary_Node *right;
};
Binary_Node* createBinaryTree(int data,Binary_Node *root){
if(root==NULL)
{
root=(Binary_Node*)malloc(sizeof(Binary_Node));
root->left=NULL;
root->right=NULL;
root->data=data;
}
else if(data<root->data){
root->left=createBinaryTree(data ,root->left);
}
else
root->right=createBinaryTree(data,root->right);
return root;
}
void print(Binary_Node *root){
if(root!=NULL)
{
print(root->left);
printf("%d\n",root->data);
print(root->right);
}
}
int main ()
{
Binary_Node *root=NULL;
int a[]={10,14 ,16,12,6,4,8};
for(int i=0;i<7;i++)
root=createBinaryTree(a[i],root);
print(root);
return 0;
}
二叉搜索树与双向链表
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
struct Binary_Node{
int data;
Binary_Node *left;
Binary_Node *right;
};
Binary_Node* createBinaryTree(int data,Binary_Node *root){
if(root==NULL)
{
root=(Binary_Node*)malloc(sizeof(Binary_Node));
root->left=NULL;
root->right=NULL;
root->data=data;
}
else if(data<root->data){
root->left=createBinaryTree(data ,root->left);
}
else
root->right=createBinaryTree(data,root->right);
return root;
}
//convertNode ,将一个二叉树转换成双向链表.
void convertNode(Binary_Node *node ,Binary_Node **lastNode){
//第二个参数是二重指针,因为后续代码需要更改指针的值所以,需要二重指针,若使用一重指针,则只改变了形参指针的值并未真正的修改实参指针的值,即真正修改指针的值用二重指针
if(node==NULL)
return ;
Binary_Node *current=node;
if(current->left!=NULL)
convertNode(current->left,lastNode);
current->left=*lastNode;
if((*lastNode)!=NULL)
(*lastNode)->right=current;
*lastNode=current;
if(current->right!=NULL)
convertNode(current->right,lastNode);
}
//将表头指针反过来(上面的函数最终指向链表的尾节点)
Binary_Node * convert(Binary_Node *root){
Binary_Node *lastNode=NULL;
convertNode(root,&lastNode);
Binary_Node *head=lastNode;
while(head!=NULL&&head->left!=NULL)
head=head->left;
return head;
}
//打印双向链表
void printList(Binary_Node *root){
while(root!=NULL){
printf("%d\n",root->data);
root=root->right;
}
}
void print(Binary_Node *root){
if(root!=NULL)
{
print(root->left);
printf("%d\n",root->data);
print(root->right);
}
}
int main ()
{
Binary_Node *root=NULL;
int a[]={10,14 ,16,12,6,4,8};
for(int i=0;i<7;i++)
root=createBinaryTree(a[i],root);
print(root);
root=convert(root);
printList(root);
return 0;
}
面试遇到的一些题
写一个对链表的快排:参照大佬的博客
在一个单向链表中找倒数第k个数:很好的图解
N个乱序的数字中寻找最大的k个数:
思路:维护一个大小为k的小根堆,堆顶元素是最大K 个数中最小的一个,即第K个元素
处理过程对于数组中的每一个元素X,判断与堆顶的大小
如果X 比堆顶小,则不需要改变原来的堆, 因为这个元素比最大的K 个 数小。
如果X比堆顶大,要用X 替换堆顶的元素Y 。调整堆的时间复杂度为O(log2K)。
时间复杂度: O (N * log2 K ),算法只需要扫描所有的数据一次
空间复杂度:大小为K的数组,只需要存储一个容量为K 的堆。
注意、大多数情况下,堆可以全部载入内存。如果K 仍然很大,我们可以尝试先找最大的K ’个元素,然后找第K ’+1个到第2 * K ’
元素,如此类推(其中容量K ’的堆可以完全载入内存)。这时,每求出K’个数,就遍历一遍数据了