北航2017年机试

1.从一个无序不重复数组中,输出中间的数和它在数组中的次序(从1开始)如果是偶数个元素,则输出两个,奇数则输出中间一个

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
#define inf 99999
int cmp(const void *a,const void *b){
    return *(double *)a-*(double *)b;
}
int main(){
    int i,n;
    double a[100];
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%lf",&a[i]);
    }
    qsort(a,n,sizeof(a[0]),cmp);
    if(n%2)printf("%.2lf\n",a[n/2]);
    else printf("%.2lf\n",(a[n/2]+a[n/2-1])/2);
    return 0;
}

2.类似于词法分析 
输入两行语法正确的C语言语句,第一行是定义变量,第二行是基本C语言表达式,输出第二行中没有在第一行被定义的变量名,如果是数组和指针,只输出数组名或指针名 
输入: 
int a,b ,_ x ,_ y,Min,MAx; 
result=a+b/2*_x+Min; 

输出:result
--------------------- 
 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
bool cmp(char c){
	if((c>='a'&&c<='z')||(c>='A'&&c<='Z')||c=='_'||(c>='0'&&c<='9'))
		return true;
	return false;
}
int main(){
	int i=0,j,tol,k;
    char s1[1000],s2[1000],aim[1000][20],tmp[20];
	cin.getline(s1,1000);
	cin.getline(s2,1000);
	tol=0,k=0;
	int len1=strlen(s1),len2=strlen(s2),lian=0;
	while(s1[i]==' ')i++;while(cmp(s1[i]))i++;while(s1[i]==' ')i++;
	j=i;
    for(i=j;i<len1;i++){
		if(s1[i]==' '){while(s1[i]==' ')i++;i--;}
        else if(s1[i]=='*')continue;
        else if(cmp(s1[i]))aim[tol][k++]=s1[i];
		else if(s1[i]==','||s1[i]==';'||s1[i]=='='){aim[tol][k]='\0',tol++,k=0;}
		else if(s1[i]=='['){
			while(s1[i]!=']')i++;
			i--;
		}
	}
	//for(i=0;i<tol;i++)printf("%s\n",aim[i]);
	int p=0,flag=0;
	for(i=0;i<len2;i++){
		if(cmp(s2[i])){
			tmp[p++]=s2[i];
		}
		else if(s2[i]=='['){
            while(s2[i]==']')i++;
			i--;
		}
		else if(s2[i]=='='||s2[i]=='+'||s2[i]=='-'||s2[i]=='*'||s2[i]=='/'||s2[i]==','||s2[i]==';'){
			if(s2[i+1]>='0'&&s2[i+1]<='9'){while(s2[i+1]>='0'&&s2[i+1]<='9')i++;i++;}
             tmp[p]='\0';
             for(j=0;j<tol;j++){
				 if(strcmp(tmp,aim[j])==0){flag=1;}
			 }
			 if(!flag)printf("%s ",tmp);
			 flag=0;
			 p=0;memset(tmp,'\0',sizeof(tmp));
		}
	}
	printf("\n");
	return 0;
}
/*
int a,b ,_x ,_y,Min,MAx; 
result=a+b/2*_x+Min; 
*/

3.二叉树的层次遍历 
题目有些复杂 
1.用什么数据结构存放二叉树数据 
2.判断任意两个结点是否同辈 

3同辈则输出共同祖先以及所在层,不同辈则从大往小输出结点值并输出其相差的辈数。

注:这里我没有处理字符串,直接按照给定数目输入亲戚关系

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
struct node{
	char name[20];
	int deep;
    node *left,*right;
};
node *q[1005],*tmp;
char na1[20],na2[20],na3[20];
int deep;
node *creatTree(int n){
	int front=1,rear=0;
    node *root,*s,*l,*r;
	root=NULL;
    while(n--){
       scanf("%s%s%s",na1,na2,na3);
	   s=NULL,l=NULL,r=NULL;
	   if(rear==0){
       s=(node *)malloc(sizeof(node));
       strcpy(s->name,na1);
	   s->left=NULL;s->right=NULL;
       q[++rear]=s;
	    root=s;
	   }
	   s=q[front++];
       l=(node *)malloc(sizeof(node));
       strcpy(l->name,na2);
	   l->left=NULL;
	   l->right=NULL;
	   s->left=l;
	   q[++rear]=l;
	   r=(node *)malloc(sizeof(node));
       strcpy(r->name,na3);
	   r->left=NULL;
	   r->right=NULL;
	   s->right=r;
	   q[++rear]=r;
	}
	return root;
}
 
void dfs(node *p,char na[],int h){
	if(p==NULL)return ;
	if(strcmp(na,p->name)==0){
       tmp=p;deep=h;
	}
	dfs(p->left,na,h+1);
	dfs(p->right,na,h+1);
}
node *lca(node *root,node *na1,node *na2){
    if(root==NULL)return NULL;
	if(root==na1||root==na2)return root;
	node *ll=lca(root->left,na1,na2);
	node *rr=lca(root->right,na1,na2);
    if(ll&&rr)return root;
	else if(ll)return ll;
	else if(rr)return rr;
	else return NULL;
}
int main()
{
    int i,n;
	node *aim1,*aim2;
    scanf("%d",&n);
	node *root=creatTree(n);
	scanf("%s%s",na1,na2);
    dfs(root,na1,1);
	aim1=tmp,aim1->deep=deep;
	dfs(root,na2,1);
	aim2=tmp,aim2->deep=deep;
    node *LCA=lca(root,aim1,aim2);
    printf("%s %d\n",LCA->name,abs(aim1->deep-aim2->deep));
    return 0;
}
/*
4
ye shu ba
shu ge mei1
ba self mei2
ge son1 son2
*/
/*
           ye
      shu       ba
   ge  mei1 self  mei2
son1 son2
*/
闲来无事,修订了一下,加上了处理亲戚关系字符串的代码。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
struct node{
	char name[20];
	int deep;
    node *left,*right;
};
node *q[1005],*tmp;
char fan[1000],na1[20],na2[20],na3[20];
int deep,stop;
void getword(char tmp[]){
    int i,j;
	stop=0;
	for(i=0;tmp[i]!=' ';i++)
       na1[i]=tmp[i];
	stop++,i++;
	int k=0;
	for(j=i;tmp[j]!=' '&&tmp[j]!='\0';j++)
	   na2[k++]=tmp[j];
    stop++;
	if(tmp[j]=='\0'){return ;}
	else {
		j++;
		strcpy(na3,tmp+j);
		stop++;
	}
}
node *creatTree(){
	int front=1,rear=0;
    node *root,*s,*l,*r;
	root=NULL;
    while(true){
       //scanf("%s%s%s",na1,na2,na3);
	   gets(fan);
	   //getchar();
	   getword(fan);
	   if(stop==2)break;
	   s=NULL,l=NULL,r=NULL;
	   if(rear==0){
       s=(node *)malloc(sizeof(node));
       strcpy(s->name,na1);
	   s->left=NULL;s->right=NULL;
       q[++rear]=s;
	    root=s;
	   }
	   s=q[front++];
       l=(node *)malloc(sizeof(node));
       strcpy(l->name,na2);
	   l->left=NULL;
	   l->right=NULL;
	   s->left=l;
	   q[++rear]=l;
	   r=(node *)malloc(sizeof(node));
       strcpy(r->name,na3);
	   r->left=NULL;
	   r->right=NULL;
	   s->right=r;
	   q[++rear]=r;
	}
	return root;
}
 
void dfs(node *p,char na[],int h){
	if(p==NULL)return ;
	if(strcmp(na,p->name)==0){
       tmp=p;deep=h;
	}
	dfs(p->left,na,h+1);
	dfs(p->right,na,h+1);
}
node *lca(node *root,node *na1,node *na2){
    if(root==NULL)return NULL;
	if(root==na1||root==na2)return root;
	node *ll=lca(root->left,na1,na2);
	node *rr=lca(root->right,na1,na2);
    if(ll&&rr)return root;
	else if(ll)return ll;
	else if(rr)return rr;
	else return NULL;
}
int main()
{
    int i,n;
	node *aim1,*aim2;
    //scanf("%d",&n);
	node *root=creatTree();
	//scanf("%s%s",na1,na2);
    dfs(root,na1,1);
	aim1=tmp,aim1->deep=deep;
	dfs(root,na2,1);
	aim2=tmp,aim2->deep=deep;
    node *LCA=lca(root,aim1,aim2);
    printf("%s %d\n",LCA->name,abs(aim1->deep-aim2->deep));
    return 0;
}
//现在就可以忽略开头那个n了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值