一.统计叶子节点个数
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