码迷,mamicode.com
首页 > 其他好文 > 详细

面试常考代码

时间:2020-07-07 21:01:02      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:scan   style   can   map   插入   base   print   最长公共子序列   mes   

快排

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<cmath>
#include<list>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
#define sc1(a) scanf("%lld",&a)
#define pf1(a) printf("%lld\n",a)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const LL INF=1e18;
const ull base=2333;
const int maxn=1e2+55;
const int maxm=1e2+50;
const int maxv=1e6+5;
const int maxk=1e8+5;
const int mod=1e9+7;

int split(int a[],int low,int high)
{
    int i=low;
    int x=a[i];//以最左边的元素为基值
    for(int j=low+1;j<=high;j++)
    {
        if(a[j]<=x)//小于x的往前放
        {
            i++;
            swap(a[i],a[j]);
        }
    }
    swap(a[i],a[low]);
    return i;
}
void Quick_sort(int a[],int low,int high)
{
    if(low<high)
    {
        int i=split(a,low,high);
        Quick_sort(a,low,i-1);
        Quick_sort(a,i+1,high);
    }
}
int main()
{
    int a[]={1,5,4,2,3};
    Quick_sort(a,0,4);
    for(int i=0;i<5;i++) cout<<a[i]<<" ";cout<<endl;
}

求数组中第k大的元素

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<cmath>
#include<list>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
#define sc1(a) scanf("%lld",&a)
#define pf1(a) printf("%lld\n",a)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const LL INF=1e18;
const ull base=2333;
const int maxn=1e2+55;
const int maxm=1e2+50;
const int maxv=1e6+5;
const int maxk=1e8+5;
const int mod=1e9+7;

priority_queue<int,vector<int>,greater<int> > q;
void solve_k(int a[],int k) //求第k大的元素
{
    //维护一个优先队列 小根堆 保证小根堆从小到大存储最大的k个元素 则小根堆第一个就是第k大
    for(int i=0;i<5;i++)
    {
        if(q.size()<k) q.push(a[i]);
        else
        {
            if(a[i]>q.top()) //出队列 存一个更大的值
            {
                q.pop();
                q.push(a[i]);
            }
        }
    }
    cout<<q.top()<<endl;

}
int main()
{
    int a[]={1,5,4,2,3};
    solve_k(a,3);
}

插入排序

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<cmath>
#include<list>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
#define sc1(a) scanf("%lld",&a)
#define pf1(a) printf("%lld\n",a)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const LL INF=1e18;
const ull base=2333;
const int maxn=1e2+55;
const int maxm=1e2+50;
const int maxv=1e6+5;
const int maxk=1e8+5;
const int mod=1e9+7;

//插入排序
//类似扑克牌思想 从后往前找到满意的位置 后面的位置全部往后移一位
void solve_sort(int a[])
{
    for(int i=1;i<5;i++)
    {
        int key=a[i];
        for(int j=i-1;j>=0;j--)
        {
            if(key<a[j])
            {
                a[j+1]=a[j];//往后移一位
            }
            else
            {
                a[j+1]=key;
                break;
            }
        }
    }
    for(int i=0;i<5;i++) cout<<a[i]<<" ";cout<<endl;
}
int main()
{
    int a[]={1,5,4,2,3};
    solve_sort(a);
}

希尔排序:在插入排序的基础上进行一种粗调,将数组分组,分组进行插入排序,不稳定

归并排序

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<cmath>
#include<list>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
#define sc1(a) scanf("%lld",&a)
#define pf1(a) printf("%lld\n",a)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const LL INF=1e18;
const ull base=2333;
const int maxn=1e2+55;
const int maxm=1e2+50;
const int maxv=1e6+5;
const int maxk=1e8+5;
const int mod=1e9+7;

// 归并排序
// 划分区间 排序 再进行合并
void Merge(int a[],int low,int high)
{
    int mid=(low+high)/2;
    // 合并 a[low,mid] a[mid+1,high]
    int len1=mid-low+1;
    int len2=high-mid;
    int *l=new int[len1];
    int *r=new int[len2];
    int k=0;
    for(int i=low;i<=mid;i++) l[k++]=a[i];
    k=0;
    for(int i=mid+1;i<=high;i++) r[k++]=a[i];
    k=low;
    int i=0,j=0;
    for(;i<len1&&j<len2;)
    {
        if(l[i]<=r[j])
        {
            a[k++]=l[i];
            i++;
        }
        else
        {
            a[k++]=r[j];
            j++;
        }
    }
    for(;i<len1;i++) a[k++]=l[i];
    for(;j<len2;j++) a[k++]=r[j];
    delete []l;
    delete []r;
}
void MergeSort(int a[],int low,int high)
{
    if(low<high)
    {
        int mid=(low+high)/2;
        MergeSort(a,low,mid);
        MergeSort(a,mid+1,high);
        Merge(a,low,high);
    }
}
int main()
{
    int a[]={1,5,4,2,3};
    MergeSort(a,0,4);
    for(int i=0;i<5;i++) cout<<a[i]<<" ";cout<<endl;
}

冒泡排序

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<cmath>
#include<list>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
#define sc1(a) scanf("%lld",&a)
#define pf1(a) printf("%lld\n",a)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const LL INF=1e18;
const ull base=2333;
const int maxn=1e2+55;
const int maxm=1e2+50;
const int maxv=1e6+5;
const int maxk=1e8+5;
const int mod=1e9+7;
//冒泡排序
// 外层循环是排序趟数
//内层比较相邻元素
void bubble_sort(int a[],int len)
{
    for(int i=0;i<len-1;i++) //len个数只需要len-1躺就能排好序了
    {
        for(int j=0;j<len-1-i;j++)
        {
            if(a[j]>a[j+1]) swap(a[j],a[j+1]);
        }
    }
}
int main()
{
    int a[]={1,5,4,2,3};
    bubble_sort(a,5);
    for(int i=0;i<5;i++) cout<<a[i]<<" ";cout<<endl;
}

选择排序:每次循环选择最小的那个跟没排序的最下的那个交换位置

堆排序:后续发表

最长上升子序列:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<cmath>
#include<list>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
#define sc1(a) scanf("%lld",&a)
#define pf1(a) printf("%lld\n",a)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const LL INF=1e18;
const ull base=2333;
const int maxn=1e2+55;
const int maxm=1e2+50;
const int maxv=1e6+5;
const int maxk=1e8+5;
const int mod=1e9+7;
int g[maxn];//g[i]表示长度为i的最长上升子序列的末尾最小值
void solve_lis(int a[],int len)
{
    for(int i=0;i<=len;i++) g[i]=INT_MAX;
    int ans=-1;
    for(int i=0;i<len;i++)
    {
        int p=lower_bound(g,g+len,a[i])-g;
        g[p]=a[i];//更新值
        ans=max(ans,p+1);
    }
    cout<<ans<<endl;
}
int main()
{
    int a[]={1,5,4,2,3};
    solve_lis(a,5);
    return 0;
}

最长公共子序列

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<cmath>
#include<list>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
#define sc1(a) scanf("%lld",&a)
#define pf1(a) printf("%lld\n",a)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const LL INF=1e18;
const ull base=2333;
const int maxn=1e2+55;
const int maxm=1e2+50;
const int maxv=1e6+5;
const int maxk=1e8+5;
const int mod=1e9+7;
int dp[maxn][maxn];
//dp[i][j]表示以a前i个和b前b个最长公共子序列长度
void solve_lcs(int a[],int lena,int b[],int lenb)
{
    for(int i=0;i<lena;i++)
    {
        for(int j=0;j<lenb;j++)
        {
            if(a[i]==b[j])
            {
                dp[i+1][j+1]=dp[i][j]+1;
            }
            else dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
        }
    }
    cout<<dp[lena][lenb]<<endl;
}
int main()
{
    int a[]={1,5,4,2,3};
    int b[]={1,4,5,2,3};
    solve_lcs(a,5,b,5);
    return 0;
}

 

面试常考代码

标签:scan   style   can   map   插入   base   print   最长公共子序列   mes   

原文地址:https://www.cnblogs.com/caijiaming/p/13262516.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!