机试学习笔记1

一.统计叶子节点个数

 1 #include<iostream>
 2 using namespce std;
 3 #define MAX_TREE_SIZE 100
 4 typedef struct{
 5     char daata;
 6     int paarent;
 7 }PTNode;
 8 typedef struct{
 9     PTNode nodes[MAX+TREE_SIZE];
10     int  n;
11 }PTree;
12 
13 int GetLeavesCount(PTree T){
14     int count=0;
15     for(int i=0;i<T.n,i++)
16         if(int j=0;j<T.n;j++){
17             if(i==j)
18                 continue;
19             else if(T.nodes[j].parent==i){
20                 count++;
21                 break;
22             }
23         }
24         return T.n-count;
25 }
26 int main(){
27     cout<<"请输入树的结点的个数:"28     int n=0; 
29     cin>>n;
30     PTree pt;
31     pt.n=n;
32     cout<<"请输入每个节点的信息:"<<endl;
33     for(int i=0;i<n;i++){
34         cin>>pt.nodes[i].data;
35         cin>>pt.nodes[i].parent;
36     }
37     int leaves=GetLeavesCount(pt);
38     cout<<leaves<<endl;
39     system("pause");
40     return 0;
41 }

二.vector建树

 1 #incluce<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5 int main(){
 6     int n;
 7     while(cin>>n){
 8         vetor<int >tree[10000];
 9         int num1,num3;
10         int maxnum;
11         maxnum=-1;
12         while(n--){
13             cin>>num1>>num2;
14             tree[num1].push_back(num2);
15             maxnum=max(max(num1,num2),maxnum);
16         } 
17         int tot;
18         tot=0;
19         for(int i=1;i<=maxnum;i++){
20             if((int )tree[i].size()==0){
21                 tot++;
22             }    
23         }
24         cout<<tot<<endl;
25     }
26     return 0;
27 }

三.输入一个数组求任意给定区间内数值的和

 1 #include<iostream>
 2 using namespace std;
 3 int main(){
 4     int n;
 5     while(cin>>n){
 6         int a[200];
 7         for(int i=1;i<=n;i++){
 8             cin>>a[i];
 9         }
10         int t;
11         cin>>t;
12         while(t--){
13             int l,r;
14             cin>>l>>r;
15             int tot;
16             tot=0;
17             for(int i=1;i<=r;i++){
18                 tot+=a[i];
19             }
20             cout<<tot<<endl;
21         }
22     }
23     return 0;
24 } 

//拓展

修改指定区间数字

计算指定区间数字和

线段树/树状数组

四.螺旋矩阵

打印出螺旋矩阵,求i j列的数字

偶数

不是偶数

 1 #include<iostream>
 2 using namespace std;
 3 void printSpiralMatrix(int **matrix,int x,int y,int start,int n){
 4     if(n<=0)
 5         return;
 6     if(n==1){
 7         maxtrix[x][y]=start;
 8         return;
 9     }
10     for(int i=x;i<x+n-1;i++)//
11         matrix[y][i]=sart++;
12     for(int j=y;j<y+n-1;j++)//
13         matrix[j][x+n-1]=start++;
14     for(int i=x+n-1;i>x;i--)//
15         matrix[y+n-1][i]=start++;
16     for(int j=y+n-1;j>y;j--)//
17         matrix[j][x]=start++;
18     printSpiralMatrix(matrix,x+1,y+1,start,n-2); 
19 }
20 int searchNum(int **matrix,int i,int j){
21     return matrix[i-1][j-1];
22 } 
23 int main(){
24     cout<<"输入螺旋矩阵的行数:"<<endl;
25     int n=0;
26     cin>>n;
27     int **matrix=(int **)malloc(n*sizeof(int *));
28     for(int i=0;i<n;i++)
29         matrix[i]=(int *)malloc(n*sizeof(int));
30         
31     printSpiralMatrix(matrix,0,0,1,n);
32     
33     for(int i=0,i<n;i++){
34         for(int j-0;j<n;j++)
35             printf("%5d",matrix[i][j]);
36         cout<<endl;
37     }
38     int num=searchNum(matrix,3,4);
39     cout<<num<<endl;
40     system("pause");
41     return 0;
42 }

五.并查集(集合的表示)

 1 //查找某个元素所在的集合 
 2 int find(int x){
 3     if(tree[x]==x)
 4         return x;
 5     return tree[x]=find(tree[x]);
 6 } 
 7 //并运算 
 8 void merge(int x,int y){
 9     int fx=find(x);
10     int fy=fnd(y);
11     if(fx!=fy)
12         tree[fx]=fy;
13 }
 1 //城市联通
 2 #include<iostream>
 3 using namespace std;
 4 int find(int s[],int x){
 5     while(s[x]!=x)
 6         x=s[x];
 7     return x;
 8 } 
 9 void initial(int *a,int n){
10     for(int i=1;i<=n;i++)
11         a[i]=i;
12 }
13 void union1(int s[],int x,int y){
14     int fx=find(s,x);
15     int fy=find(s,y);
16     if(fx!=fy)
17         s[fx]=fy;
18 }
19 //确定联通分量的个数
20 int find_ans(int s[],int n){
21     int sum=0;
22     for(int i=1;i<=n;i++)
23         if(s[i]==i)
24             ++sum;
25         return sum;
26 } 
27 int main(){
28     cout<<"输入城镇的数目和道路数目:";
29     int m=0,n=0;
30     cin>>n>>m;
31     //创建一个双亲表示法的数组 
32     int *arr=new int[n+1];
33     initial(arr,n);
34     int a=0,b=0;
35     while(n!=EOF){
36         if(!n)
37             break;
38         initial(arr,n);
39         for(int i=0;i<m;i++){
40             cin>>a>>b;
41             union1(arr,a,b);
42         }
43         printf("%d
",find_ans(arr,n)-1);
44     }
45     system("pause");
46     return 0;
47 }
48 
49 //DFS 
50 
51 //rank启发式合并 

六.最大公约数

 1 欧几里得算法(辗转相除法)
 2 #include<algorithm>  __gcd函数(两个下划线) 
 3 
 4 gcd(a,b)={gcd(b,a%b) b!=0 
 5            {  a        b=0
 6 
 7 int gcd(int a,int b){
 8     if(b==0)
 9         return a;
10     return gcd(b,a%b); 
11 }
12 
13 long long gcd(long long a,long long b){
14     if(b==0)
15         return a;
16     return gcd(b,a%b);
17 }
18 
19 int multi_gcd(int a[],int n){
20     int res=gcd(a[o],a[1]);
21     for(int i=2;i<n;i++){
22         res=gcd(res,a[i]);
23     }
24     return res;
25 }

最小公倍数

1 int lcm(int a,int b){
2     return a/gcd(a,b)*b;
3     //防止a*b溢出 
4 } 
 1 #inlcude<iostream>
 2 #include<math.h>
 3 using namespace std;
 4 int findMax(int *arr,int n){
 5     int max=arr[0];
 6     for(int i=1;i<n;i++){
 7         if(arr[i]>max)
 8             max=arr[i];
 9     }
10     cout<<max<<" ";
11     return max;
12 } 
13 int findMin(int *arr,int n){
14     int min=arr[0];
15     for(int i=1;i<n;i++)
16         if(arr[i]<min)
17             min=arr[i];
18         cout<<min<<" ";
19         return min;
20 }
21 //采用辗转相除法求解最大公约数
22 int division(int a,int b){
23     if(b>a){
24         int temp=a;
25         a=b;
26         b=temp;
27     }
28     while(true){
29         int p=a&b;
30         if(p==0)
31             return b;
32         else{
33             a=b;
34             b=p;
35         }
36     }
37 } 
38 //最小公倍数 
39 int multiNum(int a,int b){
40     int sp=division(a,b);
41     return a*b/ap;
42 }
43 int main(){
44     cout<<"输入数据的个数:";
45     int n=0;
46     cin>>n;
47     int *arr=new int[n];
48     for(int i=0;i<n;i++)
49         cin>>arr[i];
50     int a=findMin(arr,n);
51     int b=findMax(arr,n);
52     int split=division(a,b);
53     cout<<split<<endl;
54     int sp=multiNum(a,b);
55     cout<<sp<<endl;
56     system("pause");
57     return 0;
58 }

七.统计英文字母个数,单词个数,出现次数最多的字母和次数

 1 #include<iostream>
 2 #included<string>
 3 #include<set>
 4 #include<algorithm>
 5 #include<math>
 6 using namespace std;
 7 int main(){
 8     string s;
 9     while(getline(cin,s)){
10         int len;
11         len=(int )s.size()
12         set<char >charnum;
13         /*
14         set vector map
15         */
16         for(int i=0;i<len;i++){
17             if(s[i]>='A'&&s[i]<='Z'){
18                 s[i]+=32;
19             }
20         }
21         int allnum,maxnum,num[1000];
22         memset(num,0,sizeof(num));
23         allnum=0;
24         maxnum=-1;
25         for(int i=0;i<len;i++){
26             if(s[i]!=' '){
27                 charnum.insert(s[i]);
28                 num[s[i]]++;
29             }
30             if(s[i]==' '){
31                 allnum++;
32             }
33         }
34         cout<<"字母个数:"<<endl;
35         cout<<(int )charnum.size()<<endl;
36         cout<<"单词个数:"<<endl;
37         cout<<allnum+1<<endl;
38         for(int i=0;i<1000;i++){
39             if(num[i]!=0)
40             maxnum=max(num[i],maxnum);
41         }
42         cout<<"出现最多的字母:"<<endl;
43         for(int i=0;i<1000;i++){
44             if(num[i]==maxnum){
45                 char ch;
46                 ch=i;
47                 cout<<ch<<" ";
48             }
49         }
50     }
51     cout<<endl;
52     cout<<"出现次数:"<<endl;
53     cout<<maxnum<<endl;
54 } 
55 return 0;

八.进制转换

 1 //12->10
 2 #include<iostream>
 3 #include<cmath>
 4 using namespace std;
 5 
 6 int dozenCharToDecem(char c);
 7 void printDozenToDecem(char* num);
 8 int dozenToDecem(char* num);
 9 void printNumofBin(int num);
10 
11 int main(){
12     char num[100];
13     cout<<"请输入二进制数:"<<endl;
14     cin>>num;
15     printDozenToDecem(num);
16     cout<<dozenToDecem(num)<<endl;
17     printNumofBin(dozenToDecem(num));
18     return 0;
19 }
20 
21 int dozenChaarToDecem(char c){
22     int result=-1;
23     if(c>='0'&&c<='9'){
24         result
25     }
26 }
 1 #include<iostream>
 2 using namespace std;
 3 
 4 void function(int a,int b);
 5 
 6 int main(void){
 7     int a,b;
 8     cout<<"请输入a和b:";
 9     cin>>a;
10     cin>>b;
11     function(a,b);
12     return 0; 
13 }
14 
15 void function(int a,int b){
16     int count[10]={0,0,0,0,0,0,0,0,0,0};
17     int i;
18     for(i=0;i<=b;i++){
19         int temp=i;
20         while(temp/10!=0){
21             count[temp%10]++;
22             temp/=10;
23         }
24         count[temp]++;
25     }
26     for(i=0;i<10;i++){
27         cout<<count[i]<<"	";
28     }
29 }
 1 #include<iostream>
 2 using namespace std;
 3 
 4 void function(int n);
 5 
 6 int main(void){
 7     int n;
 8     cout,<"please input n:";
 9     cin>>n;
10     function(n);
11     return 0;
12 }
13 
14 void function(int n){
15     int i,j,k;
16     int temp=1;
17     for(i=0;i<n;i++){
18         for(j=0;j<n-1-i;j++){
19             cout<<' '<<'	'; 
20         }
21         for(j=0;j<i+1;j++){
22             cout<<temp<<'	';
23             temp++;
24         }
25         cout<<endl;
26     }
27 }

//STL

最大值最小值

min(,)

max(,)

快速排序sort(a,a+10);

数据交换swap(a,b);

求下一个排next_permutation  

容器类

不限制长度的数组:vector

队列queue,堆栈stack

双向队列deque

有限队列priority_queue

原文地址:https://www.cnblogs.com/shendongnian/p/12427162.html