zoukankan      html  css  js  c++  java
  • c++常考算法知识点汇总

    前言:写这篇博客完全是给自己当做笔记用的,考虑到自己的c++基础不是很踏实,只在大一学了一学期,c++的面向对象等更深的知识也一直没去学。就是想当遇到一些比较小的知识,切不值得用一整篇

    博客去记述的时候,可以考虑到都汇总在这,时不时回来复习一下也挺好。总之,这篇博客可能会不断更新,emmm,内容上也完全是准对我啦(可能更多都是算法上的知识点),大家如果看到了也别吐槽内容太乱太杂或太基础,哈哈。

    1三角函数,反三角函数,求夹角

    C++中cos,sin,asin,acos这些三角函数操作的是弧度(实数,非复数),而非角度,你需要把角度转化为弧度.

     弧度=角度*Pi/180;

    对于两条边的夹角θ=acos(v1v2/||v1||||v2||),注意θ是弧度值。

    demo如下

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 struct Point{
     4  double x;
     5  double y;
     6 };
     7 double PI=3.1415926;
     8 double Long=0;
     9 double computeLength(Point p1,Point p2)
    10 {
    11     double l=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
    12     return l;
    13 }
    14 //求两条边的夹角大小
    15 double jiaoDu(Point A,Point B,Point C)
    16 {
    17     double BA=computeLength(A,B);
    18     double BC=computeLength(B,C);
    19     double X=(A.x-B.x)*(C.x-B.x)+(A.y-B.y)*(C.y-B.y);
    20     double X1=X/BA*BC;//角度变弧度
    21     return acos(X1)*180/PI;
    22 }
    23 //求弧长
    24 double huChang(double r,double jiaodu){
    25     double huDu=jiaodu*3.1415926/180;
    26     return huDu*r;
    27 }
    28 int main()
    29 {
    30     int n=3;
    31     cout << "请输入三个点的坐标" << endl;
    32     Point point[101];
    33     for(int i=1;i<=n;i++){
    34         cin >> point[i].x;
    35         cin >> point[i].y;
    36     }
    37 
    38     cout << "向量BA的长度为" <<  setiosflags(ios::fixed) << setprecision(2)<<computeLength(point[1],point[2]) << endl;
    39     cout << "向量BC的长度为" <<  setiosflags(ios::fixed) << setprecision(2)<<computeLength(point[2],point[3]) << endl;
    40     double a=jiaoDu(point[1],point[2],point[3]);
    41     cout << "角ABC的大小为为" << setiosflags(ios::fixed) << setprecision(2)<<jiaoDu(point[1],point[2],point[3]) << endl;
    42     return 0;
    43 }
    View Code

    2malloc和new的区别

    1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
    2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
    3,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
    4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
    5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     int *p=new int[10];
     7     p[0]=1;
     8     delete p;
     9     p=NULL;
    10     
    11     int *p1=(int *)malloc(sizeof(int)*10);
    12     p1[0]=2;
    13     cout << p1[0] << endl;
    14     free(p1);
    15     
    16     return 0;
    17 }
    View Code

    3字符串和数组的几个小知识

     1  string str="hello";
     2     char arr[30];
     3     strcpy(arr,str.c_str());//字符串变字符数组 
     4     
     5     strlen(arr1)//求字符数组的长度
     6     str.length();//求字符串的长度
     7     sizeof(arr2)/sizeof(int);//求整数数组的长度 
     8     
     9     *max_element(array,array+n)//求数组里面的最大值是谁,不改变数组 
    10     *min_element(array,array+n)//求数组里面的最小值是谁,不改变数组 
    11     
    12     reverse(str.begin(),str.end());//反转字符串 
    13     
    14     reverse(arr,arr+n);
    15     puts(arr);//反转数组
    16     
    17     srand((unsigned)time(NULL));
    18     rand()%10;//产生随机数、
    19     
    20     bool cmp(int a,int b){
    21         return a>b;
    22     } 
    23     sort(a,a+n,cmp)//从大到大小排序
    24     
    25     void func(int **array,int m,int n){} <==> void func(int array[][],int m,int n){}
    View Code

    4两种全排列算法(排列的结果的顺序不同)

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int num1=0;
     4 int num2=0; 
     5 void Swap(int &a,int &b){
     6     int temp;
     7     temp=b;
     8     b=a;
     9     a=temp;
    10 }
    11 
    12 void  perm(int array[],int k,int m){
    13     if(k==m){
    14         for(int i=0;i<=m;i++){
    15             cout << array[i] << " ";
    16         }
    17         cout << endl;
    18         num1++;
    19     }
    20     else{
    21         for(int i=k;i<=m;i++){
    22             Swap(array[k],array[i]);
    23             perm(array,k+1,m);
    24             Swap(array[k],array[i]);
    25         }
    26     }
    27 }
    28 
    29 int main()
    30 {
    31     int array[10]={3,2,1,5,6,7,8,9,4,0};
    32     sort(array,array+sizeof(array)/sizeof(int));
    33     perm(array,0,4);//方法一:自定义排序函数 
    34     cout << "0~4的全排列总有" << num1 << ""  << endl;
    35    cout << "----------------------------------------------------------------" << endl;
    36    do{
    37        for(int i=0;i<5;i++){
    38            cout << array[i] << " ";
    39        }
    40        num2++;
    41        cout << endl;
    42    }while(next_permutation(array,array+5));//方法二:使用next_permutation(array,array+n);实现排序 
    43      cout << "0~4的全排列总有" << num2 << ""  << endl;
    44     return 0;
    45 }
    View Code

    5二分查找

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int binarysearch(int array[],int x,int n){
     4     int left=0;
     5     int right=n-1;
     6     while(left<right){
     7         int middle=(left+right)/2;
     8         if(array[middle]==x) return middle;
     9         if(array[middle]<x) left=middle+1;
    10         if(array[middle]>x) right=middle-1;
    11     }
    12    return -1;
    13 } 
    14 int main()
    15 {
    16     int array[10]={3,2,1,5,6,7,8,9,4,0};
    17     sort(array,array+10);
    18     int a=binarysearch(array,10,sizeof(array)/sizeof(int));
    19     if(a==-1) cout << "没找到" << endl;
    20     else   cout << "找到该数字,在顺序排列后的数组的下标为" <<  a<<  endl;
    21     return 0;
    22 }
    View Code

     6合并排序

     1 template<class Type>
     2 void MergeSort(Type a[],int left,int right)
     3 {
     4     if(left<right){//至少有两个元素 
     5         int i=(left+right)/2;//取中点 
     6         MergeSort(a,left,i);
     7         MergeSort(a,i+1,right);
     8         Merge(a,b,left,i,right);//合并到数组b 
     9         Copy(a,b,left,right);//复制回数组a 
    10     } 
    11 }
    View Code
     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 template<class Type>
     5 int Merge(Type a[],Type c[],int l,int m,int r){
     6         int i=l;
     7         int j=m+1;
     8         int k=0;
     9         while((i<=m) && (j<=r)){
    10             if(a[i]<=a[j]) c[k++]=a[i++];
    11             if(a[i]>a[j]) c[k++]=a[j++];
    12 
    13         }
    14         if(i<=m)
    15         {
    16             for(int q=i;q<=m;q++){
    17                 c[k++]=a[q];
    18             }
    19         }
    20         if(j<=r){
    21            for(int q=j;q<=r;q++){
    22                 c[k++]=a[q];
    23             }
    24         }
    25         return 1;
    26 }
    27 template<class Type>
    28 int MergeSort(Type a[],Type b[],int left,int right){
    29     if(left<right){
    30         int i=(left+right)/2;
    31         MergeSort(a,b,left,i);
    32         MergeSort(a,b,i+1,right);
    33         Merge(a,b,left,i,right);
    34     }
    35 }
    36 int main()
    37 {
    38     int a[12]={1,3,5,7,9,2,4,6,8,10,12,14};
    39     int b[12];
    40     MergeSort(a,b,0,11);
    41     for(int i=0;i<=11;i++){
    42         cout << b[i] << " ";
    43     }
    44     return 0;
    45 }
    View Code

    7快排

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 void Swap(int &a,int &b)
     4 {
     5     int temp;
     6     temp=a;
     7     a=b;
     8     b=temp;
     9 }
    10 
    11 int Partition(int a[],int p,int r)
    12 {
    13     int i=p;
    14     int j=r+1;
    15     int x=a[p];
    16     while(true){
    17         while(a[++i] < x && i<r);
    18         while(a[--j] > x);
    19         if(i>=j) break;
    20         Swap(a[i],a[j]);
    21     }
    22     a[p]=a[j];
    23     a[j]=x;
    24     return j;
    25 }
    26 void QuickSort(int a[],int p,int r)
    27 {
    28     if(p<r){
    29         int q=Partition(a,p,r);
    30         QuickSort(a,p,q-1);
    31         QuickSort(a,q+1,r);
    32     }
    33  } 
    34 int main()
    35 {
    36     int array[10]={0,5,2,7,9,1,3,4,6,8};
    37     QuickSort(array,0,9);
    38     for(int i=0;i<10;i++){
    39         cout << array[i]  << " ";
    40     }
    41     return 0;
    42 }
    View Code

     8半数集

     1 long f(int n){
     2     long sum=1;
     3     if(a[n]>0) return a[n];
     4 
     5         for(int i=1;i<=n/2;i++){
     6             sum += f(i);
     7         }
     8         a[n]=sum;
     9         return sum;
    10 }
    View Code

    9集合划分

    1 int f(int n,int m)
    2 {
    3     if(n==1) return 1;//只有一个集合
    4     if(m==m) return 1;//每个元素一个集合
    5     else{
    6         return m*f(n-1,m)+f(n-1,m+1);//向n-1个元素划分的m个集合里添加一个新元素,有m*f(n-1,m)种,
    7     }                                    //向n-1个元素划分的m个集合里添加一个独立元素,有f(n-1,m+1)种,
    8         
    9 }
    View Code

    10整数因子分解问题

    1 void f(n)
    2 {
    3     if(n==1) num+=1;
    4     for(int i=2;i<=n;i++){
    5         if(n%2==0) f(n%i);
    6     }
    7 }
    View Code

     11利用二分法求最大值

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int getMax(int array[],int begin,int end)
     4 {
     5     if(begin==end) return array[end];
     6     int mid=(begin+end)/2;
     7     int max1=getMax(array,begin,mid);
     8     int max2=getMax(array,mid+1,end);
     9     return max1>max2?max1:max2;
    10 }
    11 int main()
    12 {
    13     int array[15]={18,1,3,5,7,9,7,5,3,4,11,44,5,3};
    14     cout << getMax(array,0,13);
    15     return 0;
    16 }
    View Code

    12二叉树遍历(递归)

     1 typedef struct node                           //定义二叉树的结点
     2 {    int data;          //结点的数据
     3     struct node*lChild,*rChild;    //结点左右孩子
     4 }Node;
     5 void inOrder(Node *root)    //中序遍历
     6 {
     7     if(root!=0)              //如果根节点不为0
     8     {
     9           inOrder(root->lChild);       //指向左孩子
    10           printf("%d ",root->data);   //打印当前结点
    11           inOrder(root->rChild);      //指向右孩子
    12     }
    13 }
    View Code

     13最大字段和

     1  int MaxSum(int n,int a[])
     2       {
     3           int sum = 0;
     4           int b = 0;
     5           for(int i = 1; i <= n; i++)
     6           {
     7               if(b > 0)
     8                   b += a[i];
     9               else
    10                   b = a[i];
    11               if(b > sum)
    12                   sum = b;
    13           }
    14           return sum;
    15       }
    View Code

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~不断更新中。

  • 相关阅读:
    vmware 连网问题
    js控制表单非法输入时提交
    简单的jsp&servlet 购物车项目
    html引入css不显示问题
    每天学点java_反射作用
    java选择特定的值2--抽象enum
    java选择特定的值
    1 小时 SQL 极速入门(一)
    460004600146002MNCMCCIMSI
    网络中存在2台DHCP服务器问题
  • 原文地址:https://www.cnblogs.com/henuliulei/p/10544213.html
Copyright © 2011-2022 走看看